computer/PS

[백준] 4179 - 불! (C++)

ketrewq 2025. 5. 10. 12:57

1. 문제 소개 

 

2. 해결 방안과 알고리즘 

 

BFS로 최단거리를 계산할 수 있다. 근데 불이랑 지훈이의 움직임을 둘 다 계산해야 한다. 

 

 

만약에 fire가 먼저, 지훈이가 지나가야 할 특정 칸에 닿으면(즉, 기록하는 숫자가 fire < 지훈) 이면 탈출하지 못한다 

 

3. 코드 

#include <iostream>
#include <stack>
#include <string>
#include <queue>
#include <algorithm>
using namespace std;

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

string board[1002];
int fire[1002][1002];
int escape[1002][1002];

queue<pair<int, int>> qf;
queue<pair<int, int>> qe;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int R, C;
    cin >> R >> C;

    for (int i =0; i<R; i++){
        fill(fire[i], fire[i]+C, -1);
        fill(escape[i], escape[i]+C, -1);
        cin >> board[i];
    }


    for (int i=0; i<R; i++){
        for (int j=0; j<C; j++){
            if (board[i][j] == 'F'){
                qf.push({i, j});
                fire[i][j] = 0;
            }
            if (board[i][j] == 'J'){
                qe.push({i,j});
                escape[i][j] = 0;
            }
        }
    }


    while (!qf.empty())
    {
        pair<int, int> cur = qf.front();
        qf.pop();
        for (int dir = 0; dir < 4; dir++)
        {
            int nx = cur.first + dx[dir];
            int ny = cur.second + dy[dir];
            if (nx < 0 || nx >= R || ny < 0 || ny >= C)
                continue;
            if (fire[nx][ny] >= 0 || board[nx][ny] == '#')
                continue;
            fire[nx][ny] = fire[cur.first][cur.second] + 1;
            qf.push({nx, ny});
        }
    }


    while (!qe.empty())
    {
        pair<int, int> cur = qe.front();
        qe.pop();
        for (int dir = 0; dir < 4; dir++)
        {
            int nx = cur.first + dx[dir];
            int ny = cur.second + dy[dir];
            if (nx < 0 || nx >= R || ny < 0 || ny >= C){
                cout << escape[cur.first][cur.second] + 1;
                return 0;}
            if (escape[nx][ny] >= 0 || board[nx][ny] == '#') continue;
            if (fire[nx][ny] != -1 && fire[nx][ny] <= escape[cur.first][cur.second] +1 )
                continue;
            escape[nx][ny] = escape[cur.first][cur.second] + 1;
            qe.push({nx, ny});
        }
    }

    cout << "IMPOSSIBLE" << endl;
}

 

'computer > PS' 카테고리의 다른 글

[백준] 1492 - 합 (C++)  (0) 2025.05.12
[백준] 3015 - 오아시스 재결합 (C++)  (0) 2025.05.09
[알고리즘] BFS/DFS와 동적 계획법  (0) 2024.12.02