본문 바로가기

ALGORITHM_PRACTICE

백준 6593번: 상범 빌딩

백준 6593번: 상범 빌딩

 

6593번: 상범 빌딩

문제 당신은 상범 빌딩에 갇히고 말았다. 여기서 탈출하는 가장 빠른 길은 무엇일까? 상범 빌딩은 각 변의 길이가 1인 정육면체(단위 정육면체)로 이루어져있다. 각 정육면체는 금으로 이루어져 있어 지나갈 수 없거나, 비어있어서 지나갈 수 있게 되어있다. 당신은 각 칸에서 인접한 6개의 칸(동,서,남,북,상,하)으로 1분의 시간을 들여 이동할 수 있다. 즉, 대각선으로 이동하는 것은 불가능하다. 그리고 상범 빌딩의 바깥면도 모두 금으로 막혀있어 출구를 통해서

www.acmicpc.net

 

탈출에 성공하면 탈출시간을 출력하고 아니면 "Trapped!"를 출력한다. 왠지 스타워즈가 생각나는 문제였다.

 

1트! BFS로 풀수 있는 간단한 문제였다. 3차원이기 때문에 인덱스 위치만 헷갈리지 않으면 되는 것 같다.

동서남북상하로 이동할 때 벽('#')으로만 이동하지 않게하고 출구지점('E')에 도달했을 때 BFS 함수를 종료하고

탈출 시간을 나타나게 했다. 출구에 도달하지 못할 시엔 -1을 리턴하여 출력시 Trapped!를 출력하게했다.

그리고 L, R, C가 모두 0이여야 반복문을 종료하기 때문에 항상 반복문을 시작할때는 큐에 있는 값을 제거하고 방문여부를 false로 초기화 시켜주어야하는 것만 조심하면 풀 수 있는 문제다.

 

#include<iostream>
#include<queue>
#include<cstring>
#define HIGH_FLOOR 31
using namespace std;

typedef struct escape{
    int d;
    int h;
    int w;
    int dist;
}escape;

int L, R, C;
char building[HIGH_FLOOR][HIGH_FLOOR][HIGH_FLOOR];
bool visit[HIGH_FLOOR][HIGH_FLOOR][HIGH_FLOOR];
queue<escape> q;
void init(){
    while(!q.empty()) q.pop();
    memset(visit, false, sizeof(visit));
}
int bfs(){
    int dirD[] = {1,-1,0,0,0,0};
    int dirH[] = {0,0,1,-1,0,0};
    int dirW[] = {0,0,0,0,1,-1};
    int d, h, w, dist;
    int dd, dh, dw;
    while(!q.empty()){
        d = q.front().d;
        h = q.front().h;
        w = q.front().w;
        dist = q.front().dist;
        q.pop();
        if(building[d][h][w] == 'E') return dist;
        for(int i = 0; i < 6; i++){
            dd = d + dirD[i];
            dh = h + dirH[i];
            dw = w + dirW[i];
            if(dd < 0 || dd >= L || dh < 0 || dh >= R || dw < 0 || dw >= C) continue;
            if(building[dd][dh][dw] == '#' || visit[dd][dh][dw]) continue;
            visit[dd][dh][dw] = true;
            q.push({dd, dh, dw, dist+1});
        }
    }
    return -1;
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int res = -1;
    while(true){
        init();
        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++){
                for(int k = 0; k < C; k++){
                    cin >> building[i][j][k];
                    if(building[i][j][k] == 'S'){
                        q.push({d:i, h:j, w:k, dist:0});
                    }
                }
            }
        }
        res = bfs();
        if(res == -1) cout << "Trapped!\n";
        else cout << "Escaped in " << res << " minute(s).\n";
    }
    return 0;
}

'ALGORITHM_PRACTICE' 카테고리의 다른 글

백준 3197번: 백조의 호수  (0) 2019.06.21
백준 15656번: N과 M (7)  (0) 2019.06.20
백준 14499번: 주사위 굴리기  (0) 2019.06.20
백준 5014번: 스타트 링크  (0) 2019.06.20
백준 1629번: 곱셈  (0) 2019.06.20