티스토리 뷰

Coding/acmicpc

백준 6593:상범 빌딩

이끼대백과 2018. 4. 16. 14:39

이번문제는 백준 6593번 상범빌딩 이예요. 제가 요즘 풀고있는 탐색문제들과 같은 종류입니다. 여기서 추가된건 상하좌우에다가 높이까지 추가된 경우인데요, 탐색에서 높이만 추가해서 탐색하면 아주 쉽게 풀 수 있는 문제입니다.

밑에는 제 코드입니다.

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
#include <iostream>
#include <queue>
 
using namespace std;
 
typedef struct hrc {
    int h;
    int r;
    int c;
}pos;
 
vector<vector<vector<char>>> building;
vector<vector<vector<int>>> visited;
 
int L=1, R, C;
pos from, to;
 
int h[6= { 0,0,0,0,1,-1 };//높이
int r[6= { 0,1,0,-1,0,0 };//세로
int c[6= { -1,0,1,0,0,0 };//가로
 
bool isSafe(int h, int r, int c) {
    if (h<0 || h>- 1 || r<0 || r>- 1 || c<0 || c>- 1return false;
    return true;  //범위 벗어나는지 체크
}
 
int bfs(pos from, pos to) {
    queue<pos> q; q.push(from); visited[from.h][from.r][from.c] = 1;
    while (!q.empty()) {
        pos cur = q.front();
        if (building[cur.h][cur.r][cur.c] == 'E'return visited[cur.h][cur.r][cur.c];//E라면 탈출!
        for (int i = 0; i < 6; i++) {//6방 탐색(상하,동서남북)
            pos next = { cur.h + h[i],cur.r + r[i],cur.c + c[i] };
            if (isSafe(next.h, next.r, next.c) && !visited[next.h][next.r][next.c] && building[next.h][next.r][next.c] != '#') {
                q.push(next);  //너비탐색을 하면서 조건에 맞으면 큐에 삽입
                visited[next.h][next.r][next.c] = visited[cur.h][cur.r][cur.c] + 1;//이동거리 
            }
        }
        q.pop();
    }
    return 0;
}
 
int main(void) {
    
    while (true) {
        cin >> L >> R >> C;
        if (L == 1 && R == 1 && C == 1) {//1,1,1
            cout << "Trapped!" << endl;
            continue;
        }
        else if (L == 0 && R == 0 && C == 0break;//종료
        else {
 
            building.resize(L);//높이
            visited.resize(L); //설정
 
            for (int i = 0; i < L; i++) {
                building[i].resize(R);//세로
                visited[i].resize(R); //설정
                for (int k = 0; k < R; k++) {
                    building[i][k].resize(C);//가로
                    visited[i][k].resize(C); //설정
                }
            }
 
            for (int i = 0; i < L; i++) {
                for (int k = 0; k < R; k++) {
                    for (int t = 0; t < C; t++) {
                        cin >> building[i][k][t];//입력
                        if (building[i][k][t] == 'S') {//시작점
                            from.h = i; from.r = k; from.c = t;
                        }
                        if (building[i][k][t] == 'E') {//도착점
                            to.h = i; to.r = k; to.c = t;
                        }
                    }
                    cin.ignore();//문자를 입력받기에 '\n'버퍼를 지워요
                }
            }
 
            if (bfs(from, to)) {//
                cout << "Escaped in " << visited[to.h][to.r][to.c] - 1 << " minute(s)." << endl;
            }
            else cout << "Trapped!" << endl;
 
            visited.clear();
        }
    }
 
 
    return 0;
}
cs


'Coding > acmicpc' 카테고리의 다른 글

백준 5014:스타트링크  (0) 2018.04.16
백준 7576:토마토  (0) 2018.04.16
백준 12851, 13549, 13913:숨바꼭질 시리즈.. feat.순간이동  (8) 2018.04.03
백준 9663:숨바꼭질  (0) 2018.03.26
백준 7562:나이트의 이동  (0) 2018.03.26
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2025/01   »
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
글 보관함