ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준(C++) 6593번 [상범 빌딩]
    알고리즘(백준) 2025. 9. 14. 23:09

    6593 상범 빌딩

    접근방법

    3차원 좌표에서 출구를 찾는 방법의 최소값을 찾으면 되는 BFS의 보편적인 문제다. 

    다른 BFS 문제와 비슷하게 코드의 씀씀이만 잘 정리하면 쉽게 풀수있다.

    그래프 안에 큐를 이용하여 BFS를 만들고 반복문을 이용하여 최소값을 찾으면된다.

    정리한 몇개의 중요 키워드는 다음과 같다.

    1. BFS 그래프

    2. BFS 거리

    3. 입출력 함수

     

    출력 함수가 두 가지 상태가 있으므로 이부분만 주의 하면 쉬운 문제이다.

    (20이라면 도달 불가능 : "Trapped!" , 0보다 크다면 탈출 성공 : "Escaped in X minute(s)." 출력 )

     

    코드는 다음과 같다

     

    #include<bits/stdc++.h> //6593
    using namespace std;
    int l,r,c; // 입력변수
    int dir[6][3] = {{1,0,0},{0,1,0},{-1,0,0},{0,-1,0},{0,0,1},{0,0,-1}};
    int out; // 출력 함수
    queue<pair<pair<int,int>,int>> q; // bfs 큐선언
    int main(){
        ios::sync_with_stdio(0);
        cin.tie(0);
        while(1){
        char board[31][31][31] = {0,0,0}; // bfs 보드
        int is[31][31][31] = {0,0,0}; // bfs 거리
        int ax,ay,az; // 탈출구 저장용 함수
        cin >> l >> r >> c;
        if(l == 0 && r == 0 && c == 0)break;
        for(int a=0;a<l;a++){
            for(int i=0;i<r;i++){
                for(int j=0;j<c;j++){
                    cin >> board[i][j][a];
                    if(board[i][j][a] == 'S')q.push({{i,j},a});
                    if(board[i][j][a] == 'E'){
                        ax = i;
                        ay= j;
                        az = a;
                    }
    
    
                }
            }
        }
        while(!q.empty()){
            auto cur = q.front();q.pop();
            for(int a=0;a<6;a++){
                int nx = cur.first.first+dir[a][0];
                int ny = cur.first.second+dir[a][1];
                int nz = cur.second+dir[a][2];
                if(nx < 0 || ny < 0 || nz < 0 || nx >= r ||ny >= c || nz >= l)continue;
                if(board[nx][ny][nz] == '#'|| is[nx][ny][nz] != 0)continue;
                is[nx][ny][nz] = is[cur.first.first][cur.first.second][cur.second]+1;
                q.push({{nx,ny},nz});
    
            }
        }
        if(is[ax][ay][az] == 0)cout << "Trapped!" <<'\n';
        else cout << "Escaped in " << is[ax][ay][az] << " minute(s)." << '\n';
        }
        return 0;
    }

    '알고리즘(백준)' 카테고리의 다른 글

    백준(C) 2098번 [외판원 순회]  (0) 2025.02.24
    백준(C) 1644번 [소수의 연속합]  (3) 2025.01.28
    백준(C) 1806번 [부분합]  (3) 2025.01.28
    백준(C) 2470번 [두 용액]  (5) 2025.01.28
    백준(C) 9251번 [LCS]  (7) 2025.01.27
Designed by Tistory.