본문 바로가기

백준/골드

[백준 6593번] 상범 빌딩 (C++)

문제링크 : https://www.acmicpc.net/problem/6593

 

6593번: 상범 빌딩

당신은 상범 빌딩에 갇히고 말았다. 여기서 탈출하는 가장 빠른 길은 무엇일까? 상범 빌딩은 각 변의 길이가 1인 정육면체(단위 정육면체)로 이루어져있다. 각 정육면체는 금으로 이루어져 있어

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;
#define ll long long

struct xyz
{
    int x, y, z;
};

char field[30][30][30];
int visited[30][30][30];

queue<xyz>q;
int L, R, C;

int dx[6] = {1,-1,0,0,0,0};  //동서
int dy[6] = {0,0,1,-1,0,0};  //남북
int dz[6] = {0,0,0,0,1,-1};  //상하

int bfs()
{
    while(!q.empty())
    {
        xyz cur = q.front();
        q.pop();

        for(int i=0; i<6; i++)
        {
            int nx = cur.x + dx[i];
            int ny = cur.y + dy[i];
            int nz = cur.z + dz[i];

            if(nx<0 || ny<0 || nz<0 || nx>=L || ny>=R || nz>=C)
            {
                continue;
            }

            if(field[nx][ny][nz] == 'E')
            {
                return visited[cur.x][cur.y][cur.z] + 1;
            }

            if(visited[nx][ny][nz] == 0 && field[nx][ny][nz] == '.')
            {
                visited[nx][ny][nz] = visited[cur.x][cur.y][cur.z] + 1;
                q.push({nx, ny, nz});
            }
        }
    }
    return -1;
}

int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
   
    while(1)
    {
        while(!q.empty())  //큐 비워주기
        {
            q.pop();
        }

        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 >> field[i][j][k];
                    if(field[i][j][k]=='S')  //출발점
                    {
                        q.push({i, j, k});
                    }
                }
            }
        }
        
        memset(visited, 0, sizeof(visited));  //배열 초기화

        int time = bfs();
        if(time == -1)
        {
            cout << "Trapped!" <<"\n";
        }
        else
        {
            cout << "Escaped in " << time << " minute(s)." <<"\n";
        }
    }

    return 0;
}

x, y축에 더해 z축까지 있는 bfs문제이다.

 

문자를 기록하는 배열과, 카운트를 기록하는 배열을 선언했다.

카운트를 기록하는 배열을 0으로 초기화하여 방문 체크도 겸하였다.

 

테스트 케이스를 넘어갈 때 배열 뿐만 아니라, 큐도 비워줘야 한다.

이걸 몰라서 2시간은 날린 것 같다..