Baekjoon/Gold

C++ / 백준 / 6593 / 상범 빌딩

GitHubSeob 2022. 1. 22. 20:22

문제

https://www.acmicpc.net/problem/6593

 

6593번: 상범 빌딩

당신은 상범 빌딩에 갇히고 말았다. 여기서 탈출하는 가장 빠른 길은 무엇일까? 상범 빌딩은 각 변의 길이가 1인 정육면체(단위 정육면체)로 이루어져있다. 각 정육면체는 금으로 이루어져 있어

www.acmicpc.net

문제풀이

간단한 3차원 BFS문제.

 

값을 입력받을 때 시작 지점의 좌표를 queue에 push 한다.

push를 한 좌표부터 시작을 하고, 큐가 빌 때까지 while문을 돌리거나, E라는 탈출구를 찾으면 된다.

큐는 z좌표, y좌표, x좌표, 이동 횟수로 구성한 벡터를 입력받는다.

다음칸이 .이면 이동하고, #칸이면 이동하지 않는다.

다음칸이 E라면 cnt+1의 값을 이용해 Escaped in x minute(s).라는 문구를 출력하고 esc값을 true로 바꾼다.

(esc는 탈출을 성공했는지 여부를 나타내기 위한 bool 변수)

esc가 false이고 큐가 비었다면 탈출을 하지 못한 경우 이므로 Trapped!라는 문구를 출력한다.

마지막으로 줄 바꿈을 해준다.

 

코드

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

int L(1), R, C;

int dz[6] = { 0,0,0,0,1,-1 };
int dy[6] = { 1,-1,0,0,0,0 };
int dx[6] = { 0,0,1,-1,0,0 };

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	int z(0), y(0), x(0);
	int idx(0);
	while (!(L == 0 && R == 0 && C == 0)) {
		bool esc(false);
		queue<vector<int>>loc;
		cin >> L >> R >> C;
		vector<vector<vector<char>>>map(L, vector<vector<char>>(R, vector<char>(C, ' ')));
		vector<vector<vector<bool>>>visit(L, vector<vector<bool>>(R, vector<bool>(C, false)));
		for (z = 0; z < L; ++z) {
			for (y = 0; y < R; ++y) {
				for (x = 0; x < C; ++x) {
					cin >> map[z][y][x];
					if (map[z][y][x] == 'S')
						loc.push({ z,y,x,0 });
				}
			}
		}
		while (!loc.empty() && !esc) {
			z = loc.front()[0];
			y = loc.front()[1];
			x = loc.front()[2];
			int cnt(loc.front()[3]);
			loc.pop();

			visit[z][y][x] = true;

			for (idx = 0; idx < 6; ++idx) {
				int n_z(z + dz[idx]);
				int n_y(y + dy[idx]);
				int n_x(x + dx[idx]);
				if (n_z >= 0 && n_z < L && n_y >= 0 && n_y < R && n_x >= 0 && n_x < C) {
					if (!visit[n_z][n_y][n_x]) {
						if (map[n_z][n_y][n_x] == '.') {
							visit[n_z][n_y][n_x] = true;
							loc.push({ n_z,n_y,n_x,cnt + 1 });
						}
						else if (map[n_z][n_y][n_x] == 'E') {
							cout << "Escaped in " << cnt + 1 << " minute(s).";
							esc = true;
							break;
						}
					}
				}
			}
		}
		if (!esc && !(L == 0 && R == 0 && C == 0))
			cout << "Trapped!";
		cout << '\n';
	}
}