알고리즘/acmicpc

[백준][6593번] 상범 빌딩[cpp, c++]

장그래 2020. 2. 12. 21:13
반응형

백준 6593 상범 빌딩

 

6593번: 상범 빌딩

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

www.acmicpc.net

  • 풀이 방법
    1) bfs로 해결하면 된다.
    2) 큐, 배열 초기화 잊지 말자 !

#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
int nx[6] = { 1,0,-1,0,0,0 }; //x좌표
int ny[6] = { 0,1,0,-1,0,0 };  //y좌표
int nz[6] = { 0,0,0,0,1,-1 };
char build[31][31][31]; // 빌딩 3차원 배열
int check[31][31][31];
int L, R, C; // 높이, 행, 열 
struct point{
    int z, x, y;
};
queue<point> q;
void input_data1(){ //L, R, C 모두 0이면 종료이기 때문에 입력 함수 따로 분리  
    cin >> L >> R >> C;
}

void input_data2() {
    for (int i = 0; i < L; i++) {
        for (int j = 0; j < R; j++) {
            for (int k = 0; k < C; k++) {
                cin >> build[i][j][k];
                if (build[i][j][k] == 'S') {//시작점을 찾아서 큐에 push
                    check[i][j][k] = 1;
                    q.push({ i,j,k });
                }
            }
        }
    }
}
int bfs() {  //3차원 배열 bfs
    while (!q.empty()) {
        int z = q.front().z;
        int x = q.front().x;
        int y = q.front().y;

        q.pop();
        for (int i = 0; i < 6; i++) {
            int dz = nz[i] + z;
            int dx = nx[i] + x;
            int dy = ny[i] + y;
            if (dz >= L || dz < 0 || dx >= R || dx < 0 || dy >= C || dy < 0) continue;
            if (build[dz][dx][dy] == 'E') { // 찾았다 ! 
                cout << "Escaped in " << check[z][x][y] << " minute(s)." << "\n";
                return 1;
            }
            if (check[dz][dx][dy]) continue;
            if (build[dz][dx][dy] == '.') {
                q.push({ dz,dx,dy });
                check[dz][dx][dy] = check[z][x][y] + 1;
            }
        }

    }
    return 0;
}

void init_arr() {
    for (int i = 0; i < 31; i++) {
        for (int j = 0; j < 31; j++) {
            for (int k = 0; k < 31; k++) {
                check[i][j][k] = 0 ;
                build[i][j][k] = NULL;
            }
        }
    }
}

void sol() {
    while (1) {
        input_data1();
        if (L == 0 && R == 0 && C == 0) break; //종료 
        input_data2();
        if (bfs() == 0) cout << "Trapped!\n";
        while(!q.empty()) q.pop();
        init_arr(); //배열 초기화
    }
}




int main(void) {
    sol();
}
반응형