https://www.acmicpc.net/problem/6593
이차원 상에서의 BFS가 아니라 삼차원 상에서의 BFS
를 구현하면 된다.
이차원 상에서의 BFS를 구현할 수 있다면 이 문제 또한 쉽게 구현할 수 있을 텐데 테스트 케이스가 여러 개이기 때문에 전역변수라고 할지라도 초기화를 잊어서는 안 된다.
#include <bits/stdc++.h>
using namespace std;
char board[32][32][32];
int dist[32][32][32];
int l,r,c;
int dx[6] = {1,0,-1,0,0,0};
int dy[6] = {0,1,0,-1,0,0};
int dz[6] = {0,0,0,0,1,-1};
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
while(true) {
queue<tuple<int,int,int> > Q;
cin >> l >> r >> c;
if(l == 0 && r == 0 && c == 0)
break;
for(int i = 0; i < l; i++) {
for(int j = 0; j < r; j++) {
fill(board[i][j],board[i][j]+c,0);
fill(dist[i][j],dist[i][j]+c,0);
}
}
for(int i = 0; i < l; i++) {
for(int j = 0; j < r; j++) {
for(int k = 0; k < c; k++) {
cin >> board[i][j][k];
}
}
}
bool flag = false;
for(int i = 0; i < l; i++) {
for(int j = 0; j < r; j++) {
for(int k = 0; k < c; k++) {
if(board[i][j][k] == '#' || dist[i][j][k] > 0)
continue;
if(board[i][j][k] == 'S') {
Q.push(make_tuple(i,j,k));
}
while(!Q.empty()) {
tuple<int,int,int> cur = Q.front();
Q.pop();
for(int dir = 0; dir < 6; dir++) {
int nx = get<0>(cur) + dx[dir];
int ny = get<1>(cur) + dy[dir];
int nz = get<2>(cur) + dz[dir];
if(nx < 0 || nx >= l || ny < 0 || ny >= r || nz < 0 || nz >= c)
continue;
if(dist[nx][ny][nz] > 0)
continue;
if(board[nx][ny][nz] == '#')
continue;
if(board[nx][ny][nz] == 'E') {
cout << "Escaped in " << dist[get<0>(cur)][get<1>(cur)][get<2>(cur)] + 1 << " minute(s)." << '\n';
flag = true;
break;
}
Q.push(make_tuple(nx,ny,nz));
dist[nx][ny][nz] = dist[get<0>(cur)][get<1>(cur)][get<2>(cur)] + 1;
}
if(flag)
break;
}
if(flag)
break;
}
if(flag)
break;
}
if(flag)
break;
}
if(!flag)
cout << "Trapped!\n";
}
return 0;
}