내 코드
#include <iostream>
#include <queue>
#include <tuple>
#include <algorithm>
using namespace std;
int field[31][31][31];
int dist[31][31][31];
int xdir[6] = {1,0,-1,0,0,0,};
int ydir[6] = {0,1,0,-1,0,0};
int zdir[6] = {0,0,0,0,1,-1};
int L,R,C;
int main(void)
{
ios::sync_with_stdio(0);
cin.tie(0);
while(1)
{
cin >> L >> R >> C;
if(L==0)
return 0;
queue<tuple<int,int,int>> q;
bool ispossible = false;
for(int i = 1;i<=L;i++)
{
for(int j = 1;j<=R;j++)
{
string str; cin >> str;
for(int k = 1;k<=C;k++)
{
field[i][j][k] = str[k-1];
dist[i][j][k] = -1;
if(field[i][j][k] == 'S')
{
q.push({i,j,k});
dist[i][j][k] = 0;
}
}
}
}
while(!q.empty())
{
auto cur = q.front(); q.pop();
for(int i = 0;i<6;i++)
{
int curz = get<0>(cur) + zdir[i];
int curx = get<1>(cur) + xdir[i];
int cury = get<2>(cur) + ydir[i];
if(curz<1||curz>L||curx<1||curz>R||cury<1||cury>C) continue;
if(dist[curz][curx][cury] >= 0 || field[curz][curx][cury] == '#') continue;
q.push({curz,curx,cury});
dist[curz][curx][cury] = dist[get<0>(cur)][get<1>(cur)][get<2>(cur)] + 1;
if(field[curz][curx][cury] == 'E')
{
cout << "Escaped in " << dist[curz][curx][cury] << " minute(s)." << '\n';
ispossible = true;
break;
}
}
if(ispossible)
break;
}
if(!ispossible)
cout << "Trapped!" << '\n';
}
}
정답
int main(void){
ios::sync_with_stdio(0);
cin.tie(0);
while(1){
cin >> l >> r >> c;
if(l == 0 && r == 0 && c == 0) break;
queue<tuple<int,int,int>> Q;
char board[MX][MX][MX];
int dist[MX][MX][MX];
bool isEscape = false;
for(int i = 0; i < l; i++)
for(int j = 0; j < r; j++) 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];
if(board[i][j][k] == 'S'){
Q.push({i,j,k});
dist[i][j][k] = 0;
}
else if(board[i][j][k] == '.') dist[i][j][k] = -1;
}
}
}
while(!Q.empty()){
if(isEscape) break;
auto cur = Q.front(); Q.pop();
int curH, curX, curY;
tie(curH, curX, curY) = cur;
for(int dir = 0; dir < 6; dir++){
int nh = curH + dh[dir];
int nx = curX + dx[dir];
int ny = curY + dy[dir];
if(nx < 0 || nx >= r || ny < 0 || ny >= c || nh < 0 || nh >= l) continue;
if(board[nh][nx][ny] == '#' || dist[nh][nx][ny] > 0) continue;
dist[nh][nx][ny] = dist[curH][curX][curY] + 1;
if(board[nh][nx][ny] == 'E'){
cout << "Escaped in " << dist[nh][nx][ny] << " minute(s).\n";
isEscape = true;
break;
}
Q.push({nh,nx,ny});
}
}
while(!Q.empty()) Q.pop();
if(!isEscape) cout << "Trapped!" << "\n";
}
}