백준의 상범빌딩(6593) 문제이다.

[ 문제 바로가기 ]


[ 문제풀이 ]

1) 기본적인 BFS인데, 일반적인 2차원 맵이 아닌 3차원 맵을 관리해줘야 하는 문제이다.

   가로, 세로, 높이가 있으니, 입력받는 맵도 3차원 배열에 입력받아야 하고, 방문체크를 하는 배열도 3차원 배열을

   사용해줘야 한다.


2) 1)번에서의 배열만 잘 사용한다면 어렵지 않은 문제이다. 일반 BFS와 같이, 갈 수 있으면서 탐색하지 않은 정점을

   탐색하되, 탐색방향이 상하좌우 4방향이 아닌, 상하좌우 위아래 총 6가지 방향에 대해서 탐색해 줘야 한다.

   어렵지 않은 문제이니 소스코드를 보면 쉽게 이해할 수 있을 것이다.


[ 소스코드 ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include<iostream>
#include<cstring>
#include<queue>
 
#define endl "\n"
#define MAX 30
using namespace std;
 
int L, R, C;
char MAP[MAX][MAX][MAX];
bool Visit[MAX][MAX][MAX];
string Answer;
 
pair<pair<intint>int> Start, End;
 
int dx[] = { 001-100 };
int dy[] = { 1-10000 };
int df[] = { 00001-1 };
 
void Initialize()
{
    memset(Visit, falsesizeof(Visit));
    Answer.clear();
}
 
void Input()
{
    cin >> L >> R >> C;
    if (L == 0 && R == 0 && C == 0) exit(0);
    for (int i = 0; i < L; i++)
    {
        for (int j = 0; j < R; j++)
        {
            for (int k = 0; k < C; k++)
            {
                cin >> MAP[i][j][k];
                if (MAP[i][j][k] == 'S')
                {
                    Start.first.first = i;
                    Start.first.second = j;
                    Start.second = k;
                }
                else if (MAP[i][j][k] == 'E')
                {
                    End.first.first = i;
                    End.first.second = j;
                    End.second = k;
                }
            }
        }
    }
}
 
int BFS(int a, int b, int c)
{
    queue<pair<pair<intint>pair<intint>>> Q;
    Q.push(make_pair(make_pair(a, b), make_pair(c, 0)));    // 층, x, y, 이동횟수
    Visit[a][b][c] = true;
 
    while (Q.empty() == 0)
    {
        int f = Q.front().first.first;
        int x = Q.front().first.second;
        int y = Q.front().second.first;
        int Cnt = Q.front().second.second;
        Q.pop();
 
        if (f == End.first.first && x == End.first.second && y == End.second)
        {
            return Cnt;
        }
 
        for (int i = 0; i < 6; i++)
        {
            int nf = f + df[i];
            int nx = x + dx[i];
            int ny = y + dy[i];
 
            if (nf >= 0 && nx >= 0 && ny >= 0 && nf < L && nx < R && ny < C)
            {
                if (MAP[nf][nx][ny] == '#'continue;
                
                if (MAP[nf][nx][ny] == '.' || MAP[nf][nx][ny] == 'E')
                {
                    if (Visit[nf][nx][ny] == false)
                    {
                        Visit[nf][nx][ny] = true;
                        Q.push(make_pair(make_pair(nf, nx), make_pair(ny, Cnt + 1)));
                    }
                }
            }
        }
    }
    return -1;
}
 
void Solution()
{
    int R = BFS(Start.first.first, Start.first.second, Start.second);
    if (R == -1cout << "Trapped!" << endl;
    else cout << "Escaped in " << R << " minute(s)." << endl;
}
 
void Solve()
{
    while (1)
    {
        Initialize();
        Input();
        Solution();
    }
}
 
int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
 
    //freopen("Input.txt", "r", stdin);
    Solve();
 
    return 0;
}
cs


+ Recent posts