-
[백준/BOJ] 6593번 상범 빌딩 (C++)알고리즘 문제풀이/백준 2020. 11. 26. 11:54
BFS 문제인데 입력 배열이 3차원이라는 특징이 있습니다. 7569번 3차원 토마토 문제와 비슷해서 쉽게 해결할 수 있었습니다. (토마토 문제가 오히려 더 예외처리가 많아서 어려웠던 느낌)
#include <iostream> #include <queue> #include <cstring> #define MAX 31 using namespace std; int c, r, l; char map[MAX][MAX][MAX]; int visit[MAX][MAX][MAX]; int dz[6] = {1, -1, 0, 0, 0, 0}; int dx[6] = {0, 0, 1, -1, 0, 0}; int dy[6] = {0, 0, 0, 0, 1, -1}; struct Pos { int z, x, y; }; void BFS(int z, int x, int y) { bool flag = false; queue<Pos> q; q.push({z, x, y}); visit[z][x][y] = 0; while(!q.empty()) { int z = q.front().z; int x = q.front().x; int y = q.front().y; q.pop(); if(map[z][x][y] == 'E') { cout<<"Escaped in "<<visit[z][x][y]<<" minute(s).\n"; flag = true; break; } for(int i = 0; i < 6; i++) { int nz = z + dz[i]; int nx = x + dx[i]; int ny = y + dy[i]; if(nz < 0 || nx < 0 || ny <0 || nz >= c || nx >= r || ny >= l) continue; if(visit[nz][nx][ny] != -1 || map[nz][nx][ny] == '#') continue; q.push({nz, nx, ny}); visit[nz][nx][ny] = visit[z][x][y] + 1; } } if(!flag) cout<<"Trapped!\n"; } int main(void) { ios_base::sync_with_stdio(false); cin.tie(0); while(1) { int sz, sx, sy; cin>>c>>r>>l; if(c == 0 && r == 0 && l == 0) break; for(int i = 0; i < c; i++) { for(int j = 0; j < r; j++) { for(int k = 0; k < l; k++) { cin>>map[i][j][k]; if(map[i][j][k] == 'S') { sz = i; sx = j; sy = k; } } } } memset(visit, -1, sizeof(visit)); BFS(sz, sx, sy); } }
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준/BOJ] 16987번 계란으로 계란치기 (C++) (0) 2020.11.27 [백준/BOJ] 1600번 말이 되고픈 원숭이 (C++) (0) 2020.11.26 [백준/BOJ] 5427번 불 (C++) (0) 2020.11.24 [백준/BOJ] 10026번 적록색약 (C++) (0) 2020.11.23 [백준/BOJ] 9466번 텀 프로젝트 (C++) (0) 2020.11.23