[백준 6593] 상범 빌딩

silverCastle·2022년 1월 7일
0

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

✍️ 첫번째 접근

이차원 상에서의 BFS가 아니라 삼차원 상에서의 BFS를 구현하면 된다.
이차원 상에서의 BFS를 구현할 수 있다면 이 문제 또한 쉽게 구현할 수 있을 텐데 테스트 케이스가 여러 개이기 때문에 전역변수라고 할지라도 초기화를 잊어서는 안 된다.

#include <bits/stdc++.h>
using namespace std;
char board[32][32][32];
int dist[32][32][32];
int l,r,c;
int dx[6] = {1,0,-1,0,0,0};
int dy[6] = {0,1,0,-1,0,0};
int dz[6] = {0,0,0,0,1,-1};
int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);
    while(true) {
        queue<tuple<int,int,int> > Q;
        cin >> l >> r >> c;
        if(l == 0 && r == 0 && c == 0)
            break;
        for(int i = 0; i < l; i++) {
            for(int j = 0; j < r; j++) {
                fill(board[i][j],board[i][j]+c,0);
                fill(dist[i][j],dist[i][j]+c,0);
            }
        }
        for(int i = 0; i < l; i++) {
            for(int j = 0; j < r; j++) {
                for(int k = 0; k < c; k++) {
                    cin >> board[i][j][k];
                }
            }
        }

        bool flag = false;
        for(int i = 0; i < l; i++) {
            for(int j = 0; j < r; j++) {
                for(int k = 0; k < c; k++) {
                    if(board[i][j][k] == '#' || dist[i][j][k] > 0)
                        continue;
                    if(board[i][j][k] == 'S') {
                        Q.push(make_tuple(i,j,k));
                    }
                    while(!Q.empty()) {
                        tuple<int,int,int> cur = Q.front();
                        Q.pop();
                        for(int dir = 0; dir < 6; dir++) {
                            int nx = get<0>(cur) + dx[dir];
                            int ny = get<1>(cur) + dy[dir];
                            int nz = get<2>(cur) + dz[dir];
                            if(nx < 0 || nx >= l || ny < 0 || ny >= r || nz < 0 || nz >= c)
                                continue;
                            if(dist[nx][ny][nz] > 0)
                                continue;
                            if(board[nx][ny][nz] == '#')
                                continue;
                            if(board[nx][ny][nz] == 'E') {
                                cout << "Escaped in " << dist[get<0>(cur)][get<1>(cur)][get<2>(cur)] + 1 << " minute(s)." << '\n';
                                flag = true;
                                break;
                            }
                            Q.push(make_tuple(nx,ny,nz));
                            dist[nx][ny][nz] = dist[get<0>(cur)][get<1>(cur)][get<2>(cur)] + 1;
                        }
                        if(flag)
                            break;
                    }
                    if(flag)
                        break;
                }
                if(flag)
                    break;
            }
            if(flag)
                break;
        }
        if(!flag)
            cout << "Trapped!\n";

    }

    return 0;
}

0개의 댓글