# 생각

거리구하기 문제와 똑같다

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

+ Recent posts