BOJ 6593 상범빌딩
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;
}
다음 부터는 출력되는 것도 자세히 살펴보아야 겠다 ㅠ.ㅠ 너무 억울해
Author And Source
이 문제에 관하여(BOJ 6593 상범빌딩), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@januaryone/BOJ-6593-상범빌딩저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)