# 생각
거리구하기 문제와 똑같다
3차원 원소 접근만 잘 하면 된다
# 전체 코드
#include <bits/stdc++.h>
using namespace std;
char board[30][30][30];
int vis[30][30][30];
int dx[6] = { 1,-1,0,0,0,0 }, dy[6] = { 0,0,1,-1,0,0 }, dz[6] = { 0,0,0,0,1,-1 };
int X, Y, Z;
bool bEnd;
queue<tuple<int, int, int>> q;
void INIT()
{
bEnd = false;
q = queue<tuple<int, int, int>>(); // 큐가 빌 때까지 pop하는 방법도 있습니다
for (int i = 0; i < Z; i++)
{
for (int j = 0; j < X; j++)
{
fill(vis[i][j], vis[i][j] + Y, 0);
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
while (true)
{
cin >> Z >> X >> Y;
if (Z == 0 && X == 0 && Y == 0) break;
INIT();
for (int i = 0; i < Z; i++)
{
for (int j = 0; j < X; j++)
{
for (int k = 0; k < Y; k++)
{
cin >> board[i][j][k];
if (board[i][j][k] == 'S')
{
q.push({ i,j,k });
vis[i][j][k] = 0;
}
if (board[i][j][k] == '.')
{
vis[i][j][k] = -1;
}
}
}
}
while (!q.empty())
{
if (bEnd) break; // 이 부분 때문에 엄청 헤맸습니다. 출구가 여러개 일 경우 최소만 출력해야 합니다.
auto cur = q.front(); q.pop();
for (int dir = 0; dir < 6; dir++)
{
int nx = get<1>(cur) + dx[dir];
int ny = get<2>(cur) + dy[dir];
int nz = get<0>(cur) + dz[dir];
if (nx < 0 || nx >= X || ny < 0 || ny >= Y || nz < 0 || nz >= Z)
{
continue;
}
if (vis[nz][nx][ny] > 0 || board[nz][nx][ny] == '#')
{
continue;
}
if (board[nz][nx][ny] == 'E')
{
cout << "Escaped in " << vis[get<0>(cur)][get<1>(cur)][get<2>(cur)] + 1 << " minute(s).\n";
bEnd = true;
break;
}
vis[nz][nx][ny] = vis[get<0>(cur)][get<1>(cur)][get<2>(cur)] + 1;
q.push({ nz,nx,ny });
}
}
if (bEnd == false)
{
cout << "Trapped!\n";
}
}
}
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ] 1629_곱셈 with cpp (0) | 2022.01.25 |
---|---|
[BOJ] 5427_불 with cpp (0) | 2022.01.25 |
[BOJ] 2468_안전 영역.cpp (0) | 2022.01.23 |
[BOJ] 5014_스타트링크 with cpp (0) | 2022.01.20 |
[BOJ] 2667_단지번호붙이기 with cpp (0) | 2022.01.19 |