반응형
문제링크: https://www.acmicpc.net/problem/6593
BFS, DFS 문제입니다! 근데 이 문제는 DFS 풀이법을 허용하지 않았습니다.
최단거리를 구할때는 BFS를 사용하는 습관을 가져야겠습니다.
기본적인 BFS문제입니다. 기존에는 4방향으로 이동하지만 6방향으로 이동한다는 차이점만 있습니다.
토마토 6방향문제와 동일한 문제입니다.
너무 일반적인 문제라 설명은 생략하겠습니다.
정답코드입니다.
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int l = 0, r = 0, c = 0;
int result;
char arr[31][31][31];
int visited[31][31][31];
int y_ar[6] = { 0, 0, 1, -1, 0, 0 };
int x_ar[6] = { 0, 0, 0, 0, 1, -1 };
int z_ar[6] = { 1, -1, 0, 0, 0, 0 };
void bfs(int sz,int sy,int sx) {
queue <int> que[3];
que[0].push(sz);
que[1].push(sy);
que[2].push(sx);
visited[sz][sy][sx] = 1;
while (que[0].empty() != 1) {
int zz = que[0].front();
int yy = que[1].front();
int xx = que[2].front();
que[0].pop(), que[1].pop(), que[2].pop();
for (int i = 0; i < 6; i++) {
int z = zz + z_ar[i];
int y = yy + y_ar[i];
int x = xx + x_ar[i];
if (z >= 0 && z < l && y >= 0 && y < r && x >= 0 && x < c)
if (visited[z][y][x] == 0 && arr[z][y][x] != '#') {
visited[z][y][x] = visited[zz][yy][xx] + 1;
que[0].push(z);
que[1].push(y);
que[2].push(x);
}
}
}
for (int i = 0; i < l; i++)
for (int j = 0; j < r; j++)
for (int k = 0; k < c; k++)
if (arr[i][j][k] == 'E')
result = visited[i][j][k];
}
int main() {
cin.tie(NULL);
ios::sync_with_stdio(false);
while (1) {
cin >> l >> r >> c;
if (l == 0 && r == 0 && c == 0)
break;
memset(visited, 0, sizeof(visited));
result = (int)2e9;
int sz, sy, sx;
for (int i = 0; i < l; i++)
for (int j = 0; j < r; j++) {
cin >> arr[i][j];
for (int k = 0; k < c; k++) {
if (arr[i][j][k] == 'S')
sz = i, sy = j, sx = k;
}
}
bfs(sz, sy, sx);
if (result == 0)
cout << "Trapped!" <<"\n";
else
cout << "Escaped in " << result - 1<< " minute(s)." <<"\n";
}
return 0;
}
반응형
'알고리즘 > BFS' 카테고리의 다른 글
[백준] 1261-알고스팟(C++) (0) | 2020.08.25 |
---|---|
[백준] 9019-DSLR (0) | 2020.08.10 |
[백준] 4179-불!(C++) (0) | 2020.05.06 |
[백준] 5427-불(C++) (0) | 2020.05.06 |
[백준] 2206-벽 부수고 이동하기(C++) (0) | 2020.04.03 |