ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [6593] 상범 빌딩
    BOJ 2021. 10. 19. 12:38

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

     

    6593번: 상범 빌딩

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

    www.acmicpc.net

    <문제>

    2차원이 아닌 3차원인것이 가장 큰 차이점이다. 그외에는 사실 "[7569]토마토"와 별반 다르지 않다.

    state의 구성요소는 {행, 열, 높이}3개를 기본적으로 갖고가며, 구현의 편의상 '현재 비용'까지 추가했다.

     

    <소스코드>

    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
    #include <bits/stdc++.h>
    using namespace std;
    int l, r, c, eh, ey, ex, dy[6= {010-100},
                             dx[6= {10-1000},
                             dh[6= {00001-1};
    char a[31][31][31];
    bool visited[31][31][31];
    typedef struct {
        int h, y, x, turn;
    } state;
    int main(void) {
        int i, j, k;
        while (1) {
            cin >> l >> r >> c;
            if (l == 0 && r == 0 && c == 0break;
            queue<state> q;
            memset(visited, 0sizeof(visited));
            for (i = 0; i < l; i++) {
                for (j = 0; j < r; j++) {
                    for (k = 0; k < c; k++) {
                        cin >> a[i][j][k];
                        if (a[i][j][k] == 'S') {
                            q.push({i, j, k, 0});
                            visited[i][j][k] = true;
                        } else if (a[i][j][k] == 'E') {
                            eh = i;
                            ey = j;
                            ex = k;
                        }
                    }
                }
            }
            while (!q.empty()) {
                state cur = q.front();
                q.pop();
                if (cur.h == eh && cur.y == ey && cur.x == ex) {
                    cout << "Escaped in " << cur.turn << " minute(s).\n";
                    goto findAns;
                }
                for (i = 0; i < 6; i++) {
                    int h = cur.h + dh[i];
                    int y = cur.y + dy[i];
                    int x = cur.x + dx[i];
                    if (h < 0 || y < 0 || x < 0 || h >= l || y >= r || x >= c)
                        continue;
                    if (visited[h][y][x] == false && a[h][y][x] != '#') {
                        visited[h][y][x] = true;
                        q.push({h, y, x, cur.turn + 1});
                    }
                }
            }
            cout << "Trapped!\n";
        findAns:;
        }
        return 0;
    }
     
    cs

     

    'BOJ' 카테고리의 다른 글

    [1348] 주차장  (0) 2021.10.22
    [16920] 확장 게임  (0) 2021.10.19
    [5427] 불  (0) 2021.10.19
    [1213] 팰린드롬 만들기  (0) 2021.10.19
    [2502] 떡 먹는 호랑이  (0) 2021.10.17

    댓글