반응형
https://www.acmicpc.net/problem/3055
문제 접근법
- 단순 이동만이 아니라 물이 매턴마다 차오르는것을 신경써야 하는 문제이다.
- 주어진 맵을 그리기 위한 2차원 배열 1개와 물이 차오르는 맵을 그릴 2차원 배열 1개를 준비한다.
- 물이 차오르는 맵을 BFS를 통해 몇턴에 물이 차는지를 기록한다.
- 고슴도치를 이동횟수와 물이 차오르는 맵의 기록을 비교하여 고슴도치를 이동시킨다.
- 단 물이 차오를 곳에는 고슴도치가 이동할 수 없음을 알아야 한다.
아래는 코드입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
#include<cstdio>
#include<queue>
using namespace std;
int waterMap[51][51];
char escapeMap[51][51];
bool visit[51][51];
bool check;
int dx[] = { 0, 0, 1, -1 };
int dy[] = { 1, -1, 0, 0};
int main()
{
int r, c;
queue<pair<pair<int, int>, int>> q;
queue<pair<int, int>> q1;
scanf("%d %d", &r, &c);
for (int i = 1; i <= r; i++)
{
for (int j = 1; j <= c; j++)
{
scanf(" %c", &escapeMap[i][j]);
waterMap[i][j] = 9999;
if (escapeMap[i][j] == 'S')
{
q.push(make_pair(make_pair(i, j), 0));
}
else if (escapeMap[i][j] == '*')
{
q1.push(make_pair(i, j));
waterMap[i][j] = 0;
}
}
}
{
int x = q1.front().first;
int y = q1.front().second;
q1.pop();
for (int i = 0; i < 4; i++)
{
int nx = x + dx[i];
int ny = y + dy[i];
if (nx < 1 || nx > r || ny < 1 || ny > c || escapeMap[nx][ny] == 'D' || escapeMap[nx][ny] == 'X') continue;
if (escapeMap[nx][ny] == '.' && waterMap[nx][ny] - 1 > waterMap[x][y])
{
waterMap[nx][ny] = waterMap[x][y] + 1;
q1.push(make_pair(nx, ny));
}
}
}
while (!q.empty())
{
int moveCount = q.front().second;
visit[x][y] = true;
q.pop();
if (escapeMap[x][y] == 'D')
{
printf("%d", moveCount);
check = true;
break;
}
for (int i = 0; i < 4; i++)
{
int nx = x + dx[i];
int ny = y + dy[i];
if (nx < 1 || nx > r || ny < 1 || ny > c || escapeMap[nx][ny] == 'X') continue;
if ((escapeMap[nx][ny] == 'D' || escapeMap[nx][ny] == '.') && moveCount < waterMap[nx][ny] - 1 && !visit[nx][ny])
{
visit[nx][ny] = true;
q.push(make_pair(make_pair(nx, ny), moveCount + 1));
}
}
}
if (!check)
{
printf("%s", "KAKTUS");
}
return 0;
}
Colored by Color Scripter
|
반응형
'백준 문제풀이 > GOLD' 카테고리의 다른 글
[백준 / BOJ / GOLD 5] 16234 번 : 인구 이동 (0) | 2021.03.22 |
---|---|
[백준 / BOJ / GOLD 5] 9019 번 : DSLR (0) | 2020.04.10 |
[백준 / BOJ / GOLD 4] 13913 번 : 숨바꼭질 4 (0) | 2020.03.28 |
[백준 / BOJ / GOLD 5] 13549 번 : 숨바꼭질 3 (0) | 2020.03.27 |
[백준 / BOJ / GOLD 3] 10942 번 : 팰린드롬? (0) | 2020.03.21 |