Coding/백준

3055번 탈출

labote 2019. 9. 24. 21:07

5427번 불 문제와 같은 문제이다. 처음에 고슴도치와 비버 굴을 반대로 봐서 엄청 헤맸다. 분명 예제 3,4번은 불가능한데 왜 가능한 횟수가 나오지? 라고 계속 고민하다가 문제를 다시 읽어보고 둘이 바뀐 것을 깨달았다...

 

#include <iostream>
#include <queue>
#define visited true
#define Non_visited false
#define MAX 51

using namespace std;

typedef pair<int,int> pr;
char map[MAX][MAX];
int cnt[MAX][MAX];
bool Check[MAX][MAX];
int xx[4]={1,0,-1,0};
int yy[4]={0,1,0,-1};
queue<pr> water;
queue<pr> hedgehog;

void bfs(int M, int N){

    while(!hedgehog.empty()){

        long int waterSize = water.size();
        long int hedgehogSize = hedgehog.size();

        while(waterSize--){
            int x = water.front().first;
            int y = water.front().second;
            water.pop();

            for(int i=0;i<4;i++){
                int nx=x+xx[i];
                int ny=y+yy[i];

                if(nx<0 || ny<0 || nx>=M || ny>=N) continue;
                if(map[nx][ny]=='X' || map[nx][ny]=='D' || map[nx][ny]=='*') continue;
                map[nx][ny]='*';
                water.push(pr(nx,ny));
            }
        }

        while(hedgehogSize--){
            int x = hedgehog.front().first;
            int y = hedgehog.front().second;
            hedgehog.pop();

            if(Check[x][y]==visited) continue;
            Check[x][y]=visited;

            for(int i=0;i<4;i++){
                int nx=x+xx[i];
                int ny=y+yy[i];

                if(nx<0 || ny<0 || nx>=M || ny>=N) continue;
                if(map[nx][ny]=='*' || map[nx][ny]=='X' || Check[nx][ny]==visited || map[nx][ny]=='S') continue;
                if(map[nx][ny]=='D') {
                    cout << cnt[x][y]+1 << endl;
                    return;
                }
                map[nx][ny]='S';
                cnt[nx][ny]=cnt[x][y]+1;
                hedgehog.push(pr(nx,ny));
            }
        }

    }
    cout << "KAKTUS" << endl;
}

int main(){
    int M,N;
    cin >> M >> N;
    
    for(int i=0;i<M;i++){
        for(int j=0;j<N;j++){
            char k;
            cin >> k;
            map[i][j]=k;
            if(map[i][j]=='S') hedgehog.push(pr(i,j));
            if(map[i][j]=='*') water.push(pr(i,j));
        }
    }
    bfs(M,N);
}