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';
}
}