수학과의 좌충우돌 프로그래밍

[C++] BAEKJOON 6593 상범 빌딩 본문

알고리즘/C++

[C++] BAEKJOON 6593 상범 빌딩

ssung.k 2019. 11. 1. 01:08

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

 

6593번: 상범 빌딩

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

www.acmicpc.net

BFS 를 이용하여 문제를 해결하였습니다.

  • 건물이 층, 폭, 너비 3차원이기 때문에 3차원 배열과 각 좌표를 담을 수 있는 pair3 를 선언하였습니다.
  • 입력을 받으면서 S 가 있는 시작지점을 기억해둔 후, 이 지점부터 BFS 탐색을 했습니다.
  • 다음 단계로 넘어갈 때마다 distance 를 하나씩 증가시켜 해당 지점까지의 거리를 측정하였습니다.
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>

using namespace std;

char board[31][31][31];

int dh[] = {0,0,0,0,1,-1};
int dr[] = {0,0,1,-1,0,0};
int dc[] = {1,-1,0,0,0,0};

typedef struct pair3 {
    int h;
    int r;
    int c;
} pair3;

int bfs(pair3 start,int height, int rows, int cols){
    queue<pair3> q;
    q.push(start);
    
    int distance = 0;
    
    while(!q.empty()){
        int q_size = q.size();
        for (int i=0;i<q_size;i++){
            //cout << i << "\n";
            int h = q.front().h;
            int r = q.front().r;
            int c = q.front().c;
            q.pop();
            
            for (int i=0;i<6;i++){
                int nh = h + dh[i];
                int nr = r + dr[i];
                int nc = c + dc[i];
                if (0<=nh && nh<height && 0<=nr && nr<rows && 0<=nc && nc<cols){
                    
                    if(board[nh][nr][nc] == 'E'){
                        return distance;
                    }
                    
                    else if (board[nh][nr][nc] == '.'){
                        board[nh][nr][nc] = '#';
                        pair3 npoint = {nh,nr,nc};
                        q.push(npoint);
                    }
                }
            }
        }
        distance++;
    }
    return -1;
}

int main(int argc, const char * argv[]) {

    while (1){
        memset(board, 0, sizeof(board));
        
        int height, rows, cols;
        cin >> height >> rows >> cols;
        
        if (height == 0 && rows == 0 && cols == 0)
            return 0;
        
        pair3 start;
        
        for (int h=0;h<height;h++){
            for (int r=0;r<rows;r++){
                string str;
                cin >> str;
                for (int c=0;c<cols;c++){
                    board[h][r][c] = str[c];
                    if (board[h][r][c] == 'S'){
                        start = {h,r,c};
                    }
                }
            }
        }
        
        int result = bfs(start,height, rows, cols);
        
        if (result == -1)
            cout << "Trapped!" << "\n";
        else
            cout << "Escaped in " << result+1 << " minute(s)." << "\n";
        
    }
    return 0;
}

 

Comments