6593번: 상범 빌딩
당신은 상범 빌딩에 갇히고 말았다. 여기서 탈출하는 가장 빠른 길은 무엇일까? 상범 빌딩은 각 변의 길이가 1인 정육면체(단위 정육면체)로 이루어져있다. 각 정육면체는 금으로 이루어져 있어
www.acmicpc.net
6방향으로 BFS를 수행하며 거리를 구해가면된다. 좌표는 tuple STL을 사용하여 구현하였다.
한시간 동안 고민했는데 틀린이유는 출력시 마지막에 .을 찍어주지 않아 계속해서 틀렸다. 다른 곳에서 삽질 ㅠ.ㅠ
#include <bits/stdc++.h>
using namespace std;
int L, R, C;
string building[31][31];
int dist[31][31][31];
int dx[6] = {-1, 1, 0, 0, 0, 0};
int dy[6] = {0, 0, -1, 1, 0, 0};
int dz[6] = {0, 0, 0, 0, -1, 1};
int main() {
cout.sync_with_stdio(0);
cin.tie(0);
while(true){
bool flag = false;
cin >> L >> R >> C;
if(L == 0 && R == 0 && C == 0) break;
//initialize dist to -1
for(int i = 0; i < L; i++){
for(int j = 0; j < R; j++) {
fill(dist[i][j], dist[i][j] + C, -1);
}
}
queue<tuple<int, int, int>> Q;
tuple<int, int, int> End;
for(int i = 0; i < L; i++) {
for(int j = 0; j < R; j++) {
cin >> building[i][j];
string input = building[i][j];
for(int k = 0; k < C; k++) {
if(input[k] == 'S') {
Q.push(make_tuple(i, j, k));
dist[i][j][k] = 0;
}
if(input[k] == 'E') {
End = make_tuple(i, j, k);
}
}
}
}
while(!Q.empty()) {
if(flag) break;
auto cur = Q.front(); Q.pop();
int curX, curY, curZ;
tie(curZ, curX, curY) = cur;
for(int i = 0; i < 6; i++) {
int nz = curZ + dz[i];
int ny = curY + dy[i];
int nx = curX + dx[i];
if(nz < 0 || nz >= L || nx < 0 || nx >= R || ny < 0 || ny >= C) continue;
if(dist[nz][nx][ny] != -1) continue;
if(building[nz][nx][ny] == '#') continue;
Q.push(make_tuple(nz, nx, ny));
dist[nz][nx][ny] = dist[curZ][curX][curY] + 1;
if(building[nz][nx][ny] == 'E') {
flag = true;
cout << "Escaped in " << dist[nz][nx][ny] << " minute(s)." << '\n';
break;
}
}
}
if(!flag){
cout << "Trapped!" << '\n';
}
}
return 0;
}
다음 부터는 출력되는 것도 자세히 살펴보아야겠다.
'PS' 카테고리의 다른 글
BOJ 13913: 숨바꼭질 4 C++ (0) | 2021.11.30 |
---|---|
BOJ 9466 텀 프로젝트 C++ (0) | 2021.11.30 |
BOJ 2146 다리만들기 C++ (0) | 2021.11.30 |