PS

BOJ 6593 상범빌딩 C++

소재훈 2021. 11. 30. 16:14
 

6593번: 상범 빌딩

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

www.acmicpc.net

6방향으로 BFS를 수행하며 거리를 구해가면된다. 좌표는 tuple STL을 사용하여 구현하였다.

한시간 동안 고민했는데 틀린이유는 출력시 마지막에 .을 찍어주지 않아 계속해서 틀렸다. 다른 곳에서 삽질 ㅠ.ㅠ

#include <bits/stdc++.h>
using namespace std;
int L, R, C;
string building[31][31];
int dist[31][31][31];
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 main() {
    cout.sync_with_stdio(0);
    cin.tie(0);
    while(true){
        bool flag = false;
        cin >> L >> R >> C;
        if(L == 0 && R == 0 && C == 0) break;

        //initialize dist to -1
        for(int i = 0; i < L; i++){
            for(int j = 0; j < R; j++) {
                fill(dist[i][j], dist[i][j] + C, -1);
            }
        }

        queue<tuple<int, int, int>> Q;
        tuple<int, int, int> End;

        for(int i = 0; i < L; i++) {
            for(int j = 0; j < R; j++) {
                cin >> building[i][j];
                string input = building[i][j];
                for(int k = 0; k < C; k++) {
                    if(input[k] == 'S') {
                        Q.push(make_tuple(i, j, k));
                        dist[i][j][k] = 0;
                    }
                    if(input[k] == 'E') {
                        End = make_tuple(i, j, k);
                    }
                }
            }
        }
        while(!Q.empty()) {
            if(flag) break;
            auto cur = Q.front(); Q.pop();
            int curX, curY, curZ;
            tie(curZ, curX, curY) = cur;
            for(int i = 0; i < 6; i++) {
                int nz = curZ + dz[i];
                int ny = curY + dy[i];
                int nx = curX + dx[i];
                if(nz < 0 || nz >= L || nx < 0 || nx >= R || ny < 0 || ny >= C) continue;
                if(dist[nz][nx][ny] != -1) continue;
                if(building[nz][nx][ny] == '#') continue;
                Q.push(make_tuple(nz, nx, ny));
                dist[nz][nx][ny] = dist[curZ][curX][curY] + 1;
                if(building[nz][nx][ny] == 'E') {
                    flag = true;
                    cout << "Escaped in " << dist[nz][nx][ny] << " minute(s)." << '\n';
                    break;
                }
            }
        }
        if(!flag){
            cout << "Trapped!" << '\n';
        }
    }
    return 0;
}

다음 부터는 출력되는 것도 자세히 살펴보아야겠다.

'PS' 카테고리의 다른 글

BOJ 13913: 숨바꼭질 4 C++  (0) 2021.11.30
BOJ 9466 텀 프로젝트 C++  (0) 2021.11.30
BOJ 2146 다리만들기 C++  (0) 2021.11.30