• Home
  • About
    • Develop Woongs photo

      Develop Woongs

      make awesome woongs

    • Learn More
    • Facebook
    • Instagram
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

Algorithm-BOJ-6593

19 Mar 2019

Reading time ~2 minutes

6593번: 상범 빌딩

3차원으로 입력이 조금 까다롭긴 하지만 탐색하던 경우가 4개에서 6개로 늘어난 것 말고는 기존의 BFS와 같은 방식으로 하면 된다!

3차원으로 늘어났기 때문에 더이상 pair로는 할 수 없고 S, E 등 시작점과 종료점을 기록해주기도 해야한다. 구조체를 만들어서 사용하자!

    struct Point {
        int z, y, x;
        Point(int a, int b, int c) { z = a; y = b; x = c; };
        Point() {};
    };

3차원에 경우가 6개로 늘어났기 때문에 와 같이 6개로 늘려주면 끝!

    int ml[6] = { 0, 0, 0, 0, 1, -1 };
    int mr[6] = { -1, 0, 1, 0, 0, 0 };
    int mc[6] = { 0, 1, 0, -1, 0, 0 };

0 0 0 일 때 종료해줘야 하기 때문에 0 0 0 외에 새로운 input을 받으면 꼭 이전의 값을 reset해줘야 한다!

    void reset() {
        for(int i=0; i<L; i++) {
            for(int j=0; j<R; j++) {
                for(int k=0; k<C; k++) {
                    map[i][j][k] = ' ';
                }
            }
        }
        
        for(int i=0; i<L; i++) {
            for(int j=0; j<R; j++) {
                for(int k=0; k<C; k++) {
                    visited[i][j][k] = 0;
                }
            }
        }
    }
풀이보기
```c++
    #include <iostream>
    #include <algorithm>
    #include <queue>
    using namespace std;
    
    struct Point {
        int z, y, x;
        Point(int a, int b, int c) { z = a; y = b; x = c; };
        Point() {};
    };
    
    int L = 1, R = 1, C = 1;
    char map[31][31][31];
    int visited[31][31][31];
    int ml[6] = { 0, 0, 0, 0, 1, -1 };
    int mr[6] = { -1, 0, 1, 0, 0, 0 };
    int mc[6] = { 0, 1, 0, -1, 0, 0 };
    Point sp, ep;
    
    void bfs() {
        queue<Point> q;
        q.push(sp);
    
        while (!q.empty()) {
            Point p = q.front(); q.pop();
            for(int i=0; i<6; i++) {
                int dl = p.z + ml[i];
                int dr = p.y + mr[i];
                int dc = p.x + mc[i];
    
                if(dl<0 || dr<0 || dc<0 || dl>=L || dr>=R || dc>=C ) continue;
                if(visited[dl][dr][dc]) continue;
                if(map[dl][dr][dc] == '#') continue;
    
                visited[dl][dr][dc] = visited[p.z][p.y][p.x] + 1;
                q.push(Point(dl, dr, dc));
            }
    
        }
    }
    
    void reset() {
        for(int i=0; i<L; i++) {
            for(int j=0; j<R; j++) {
                for(int k=0; k<C; k++) {
                    map[i][j][k] = ' ';
                }
            }
        }
        
        for(int i=0; i<L; i++) {
            for(int j=0; j<R; j++) {
                for(int k=0; k<C; k++) {
                    visited[i][j][k] = 0;
                }
            }
        }
    }
    
    int main(int argc, const char * argv[]) {
        while (true) {
            scanf("%d %d %d", &L, &R, &C);
    
            if ( !L && !R && !C ) break;
            reset();
            
            for(int i=0; i<L; i++) {
                for(int j=0; j<R; j++) {
                    scanf("%s", map[i][j]);
                    for(int k=0; k<C; k++) {
                        if( map[i][j][k] == 'S') {
                            sp = Point(i, j, k);
                        } else if (map[i][j][k] == 'E') {
                            ep = Point(i, j, k);
                        }
                    }
                }
                getchar();
            }
    
    
            bfs();
            visited[ep.z][ep.y][ep.x] > 0 ? printf("Escaped in %d minute(s).\n", visited[ep.z][ep.y][ep.x]) : printf("Trapped!\n");
            
        }
    
        return 0;
    }
```

0 0 0이면 입력이 끝난다는 것을 파악하지 못해서 틀리고 reset을 해주지 않아서 또 틀리고… 문제를 똑바로 읽고 잔 실수를 없애자



c++Algorithm Share Tweet +1