Algorithm/백준

[백준][C++] 6593번: 상범 빌딩 <242>

샤아이인 2022. 9. 5.

직접 풀어보고 올리는 코드입니다. 지적이나 더 좋은 방향에 대한 댓글은 항상 환영합니다.

 

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

 

6593번: 상범 빌딩

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

www.acmicpc.net

 

1. 생각의 흐름

너무나 단순한 BFS 탐색 문제이다.

 

우선 우리는 좌표와 몇분이 걸리는지를 저장하기 위해 Position이라는 Class를 다음과 같이 정의하자.

class Position {
public:
    int x, y, z;
    int minute;
public:
    Position() {}
    Position(int x, int y, int z, int minute) : x(x), y(y), z(z), minute(minute) {}
};

 

처음 input을 받을때, start, endPosition을 저장해 둔다.

이후 6방향을 탐색하면서 BFS를 진행하면 간단하게 해결되는 문제이다.

 

코드를 보면 좀더 빠른 이해가 될 것 이다.

 

 

2. 나의 코드

#include <bits/stdc++.h>
#include <iostream>

using namespace std;
#define MAX 31

int L, R, C;
char MAP[MAX][MAX][MAX];
bool visited[MAX][MAX][MAX];

int dx[] = {0, 0, 1, -1, 0, 0};
int dy[] = {1, -1, 0, 0, 0, 0};
int dz[] = {0, 0, 0, 0, 1, -1};

class Position {
public:
    int x, y, z;
    int minute;
public:
    Position() {}

    Position(int x, int y, int z, int minute) : x(x), y(y), z(z), minute(minute) {}
};

static Position start, endPosition;

void init() {
    memset(MAP, 0, sizeof(MAP));
    memset(visited, false, sizeof(visited));
}

int BFS(int x, int y, int z) {
    queue<Position> Q;
    visited[x][y][z] = true;
    Q.push(Position(x, y, z, 0));

    while(!Q.empty()) {
        int nowX = Q.front().x;
        int nowY = Q.front().y;
        int nowZ = Q.front().z;
        int minute = Q.front().minute;
        Q.pop();

        if(nowX == endPosition.x && nowY == endPosition.y && nowZ == endPosition.z) {
            return minute;
        }

        for(int i = 0; i < 6; i++) {
            int nx = nowX + dx[i];
            int ny = nowY + dy[i];
            int nz = nowZ + dz[i];

            if(nx < 0 || ny < 0 || nz < 0 || nx >= R || ny >= C || nz >= L) continue;

            if(!visited[nx][ny][nz]) {
                if (MAP[nx][ny][nz] == '.' || MAP[nx][ny][nz] == 'E') {
                    visited[nx][ny][nz] = true;
                    Q.push(Position(nx, ny, nz, minute + 1));
                }
            }
        }
    }
    return -1;
}


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

    while (true) {
        cin >> L >> R >> C;
        if (L == 0 && R == 0 && C == 0) {
            break;
        }

        for (int h = 0; h < L; h++) {
            for (int i = 0; i < R; i++) {
                for (int j = 0; j < C; j++) {
                    cin >> MAP[i][j][h];
                    if (MAP[i][j][h] == 'S') {
                        start.x = i;
                        start.y = j;
                        start.z = h;
                    } else if (MAP[i][j][h] == 'E') {
                        endPosition.x = i;
                        endPosition.y = j;
                        endPosition.z = h;
                    }
                }
            }
        }

        int m = BFS(start.x, start.y, start.z);
        if(m == -1) {
            cout << "Trapped!" << "\n";
        }else {
            cout << "Escaped in " << m << " minute(s)." << "\n";
        }
        init();
    }

    return 0;
}

댓글