본문 바로가기
Problem solving/BOJ

[BOJ] 6593. 상범 빌딩 (C++)

by 겸 2023. 8. 23.

문제

정육면체는 금으로 이루어져서 나갈 수 없거나 비어있어서 지나갈 수 있게 되어있다.

금으로 막혀있어 지나갈 수 없는 칸은 '#'으로 표현되고, 비어있는 칸은 '.'으로 표현된다.

당신의 시작 지점은 'S'로 표현되고, 탈출할 수 있는 출구는 'E'로 표현된다.

각 층 사이에는 빈 줄이 있으며, 입력의 끝은 L, R, C가 모두 0으로 표현된다.

시작 지점과 출구는 항상 하나만 있다.

탈출하는데 필요한 최단 시간은?

생각할 것

층이 있었기에 3차원 벡터로 만들어주었다

코드

#include <iostream>
#include <vector>
#include <queue>
#include <tuple>

using namespace std;

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

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int L, R, C;
    while (true) {
        // input
        cin >> L >> R >> C;
        if (L == 0 && R == 0 && C == 0) break;
        vector<vector<vector<char>>> building(L, vector<vector<char>>(R, vector<char>(C)));
        vector<vector<vector<int>>> visited(L, vector<vector<int>>(R, vector<int>(C, -1)));
        queue<tuple<int, int, int>> q;
        for (int l = 0; l < L; l++) {
            for (int r = 0; r < R; r++) {
                for (int c = 0; c < C; c++) {
                    cin >> building[l][r][c];
                    if (building[l][r][c] == 'S') {
                        q.push({l, r, c});
                        visited[l][r][c] = 0;
                    }
                }
            }
        }

        // 탈출
        int success = false;
        while (!q.empty()) {
            tuple<int, int, int> cur = q.front();
            q.pop();
            int cl = get<0>(cur);
            int cx = get<1>(cur);
            int cy = get<2>(cur);
            if (building[cl][cx][cy] == 'E') {
                cout << "Escaped in " << visited[cl][cx][cy] << " minute(s).\\n";
                success = true;
                break;
            }
            for (int k = 0; k < 6; k++) {
                int nl = cl + dl[k];
                int nx = cx + dx[k];
                int ny = cy + dy[k];
                if (nl < 0 || nl >= L || nx < 0 || nx >= R || ny < 0 || ny >= C) continue;
                if (visited[nl][nx][ny] != -1) continue;
                if (building[nl][nx][ny] != '#') {
                    q.push({nl, nx, ny});
                    visited[nl][nx][ny] = visited[cl][cx][cy] + 1;
                }
            }
        }
        if (!success) cout << "Trapped!\\n";
    }

    return 0;
}
반응형

'Problem solving > BOJ' 카테고리의 다른 글

[BOJ] 2468. 안전 영역 (C++)  (0) 2023.08.23
[BOJ] 7785. 회사에 있는 사람 (C++)  (0) 2023.08.11
[BOJ] 1920. 수 찾기 (C++)  (0) 2023.08.11
[BOJ] 2230. 수 고르기 (C++)  (0) 2023.08.11