알고리즘

[알고리즘] 백준 4179 - 불! (C++)

blueberrysoda 2024. 8. 27. 23:50

[문제 링크] : https://www.acmicpc.net/problem/4179

#include <iostream>
#include <queue>
using namespace std;

int R, C;
char Arr[1001][1001];
int Fire[1001][1001];
bool Visit[1001][1001];
int Dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
int Y, X;
queue<pair<int, int>> Q;

int solve(int a, int b){
    queue<pair<int, pair<int, int>>> q;
    q.push({0, {a, b}});
    Visit[a][b] = true;

    while(q.empty() == false){
        int y = q.front().second.first;
        int x = q.front().second.second;
        int cnt = q.front().first;
        q.pop();

        if(y == 0 || x == 0 || y == R-1 || x == C-1) return cnt + 1;

        for(int i=0; i<4; i++){
            int ny = y + Dir[i][0];
            int nx = x + Dir[i][1];
            if(ny >= 0 && nx >= 0 && ny < R && nx < C){
                if(Arr[ny][nx] != '#' && Visit[ny][nx] == false){
                    if(Fire[ny][nx] > cnt + 1){
                        Visit[ny][nx] = true;
                        q.push({cnt + 1, {ny, nx}});
                    }
                }
            }
        }
    }
    return -1;
}

int main(){
    cin >> R >> C;

    for(int i=0; i<R; i++){
        for(int j=0; j<C; j++){
            cin >> Arr[i][j];
            if(Arr[i][j] == 'J'){
                Y = i;
                X = j;
                Fire[i][j] = 1234567890;
            }
            else if(Arr[i][j] == 'F'){
                Q.push({i, j});
                Fire[i][j] = 0;
            }
            else{
                Fire[i][j] = 1234567890;
            }
        }
    }

    while(Q.empty() == false){
        int sz = Q.size();
        for(int i=0; i<sz; i++){
            int y = Q.front().first;
            int x = Q.front().second;
            Q.pop();

            for(int j=0; j<4; j++){
                int ny = y + Dir[j][0];
                int nx = x + Dir[j][1];

                if(ny < 0 || nx < 0 || ny >= R || nx >= C) continue;
                if(Arr[ny][nx] == '#') continue;
                if(Fire[ny][nx] > Fire[y][x] + 1){
                    Fire[ny][nx] = Fire[y][x] + 1;
                    Q.push({ny, nx});
                }
            }
        }
    }

    int Ans = solve(Y, X);

    if(Ans == -1){
        cout << "IMPOSSIBLE\n";
    }
    else{
        cout << Ans << "\n";
    }
    return 0;
}