• toc {:toc}

문제

μ§€ν›ˆμ΄λŠ” λ―Έλ‘œμ—μ„œ 일을 ν•œλ‹€. μ§€ν›ˆμ΄λ₯Ό λ―Έλ‘œμ—μ„œ νƒˆμΆœν•˜λ„λ‘ λ„μ™€μ£Όμž!

λ―Έλ‘œμ—μ„œμ˜ μ§€ν›ˆμ΄μ˜ μœ„μΉ˜μ™€ 뢈이 뢙은 μœ„μΉ˜λ₯Ό κ°μ•ˆν•΄μ„œ μ§€ν›ˆμ΄κ°€ λΆˆμ— 타기전에 νƒˆμΆœν•  수 μžˆλŠ”μ§€μ˜ μ—¬λΆ€, 그리고 μ–Όλ§ˆλ‚˜ 빨리 νƒˆμΆœν•  수 μžˆλŠ”μ§€λ₯Ό κ²°μ •ν•΄μ•Όν•œλ‹€.

μ§€ν›ˆμ΄μ™€ λΆˆμ€ λ§€ λΆ„λ§ˆλ‹€ ν•œμΉΈμ”© μˆ˜ν‰λ˜λŠ” 수직으둜(λΉ„μŠ€λ“¬ν•˜κ²Œ μ΄λ™ν•˜μ§€ μ•ŠλŠ”λ‹€)Β  μ΄λ™ν•œλ‹€.

λΆˆμ€ 각 μ§€μ μ—μ„œ λ„€ λ°©ν–₯으둜 ν™•μ‚°λœλ‹€.

μ§€ν›ˆμ΄λŠ” 미둜의 κ°€μž₯μžλ¦¬μ— μ ‘ν•œ κ³΅κ°„μ—μ„œ νƒˆμΆœν•  수 μžˆλ‹€.

μ§€ν›ˆμ΄μ™€ λΆˆμ€ 벽이 μžˆλŠ” 곡간은 ν†΅κ³Όν•˜μ§€ λͺ»ν•œλ‹€.

μž…λ ₯

μž…λ ₯의 첫째 μ€„μ—λŠ” 곡백으둜 κ΅¬λΆ„λœ 두 μ •μˆ˜ Rκ³Ό Cκ°€ μ£Όμ–΄μ§„λ‹€. 단, 1 ≀ R, C ≀ 1000 이닀. R은 미둜 ν–‰μ˜ 개수, CλŠ” μ—΄μ˜ κ°œμˆ˜μ΄λ‹€.

λ‹€μŒ μž…λ ₯으둜 Rμ€„λ™μ•ˆ 각각의 미둜 행이 μ£Όμ–΄μ§„λ‹€.

각각의 λ¬Έμžλ“€μ€ λ‹€μŒμ„ λœ»ν•œλ‹€.

  • #: λ²½
  • .: μ§€λ‚˜κ°ˆ 수 μžˆλŠ” 곡간
  • J: μ§€ν›ˆμ΄μ˜ λ―Έλ‘œμ—μ„œμ˜ μ΄ˆκΈ°μœ„μΉ˜ (μ§€λ‚˜κ°ˆ 수 μžˆλŠ” 곡간)
  • F: 뢈이 λ‚œ 곡간

JλŠ” μž…λ ₯μ—μ„œ ν•˜λ‚˜λ§Œ μ£Όμ–΄μ§„λ‹€.

좜λ ₯

μ§€ν›ˆμ΄κ°€ 뢈이 λ„λ‹¬ν•˜κΈ° 전에 미둜λ₯Ό νƒˆμΆœ ν•  수 μ—†λŠ” 경우 IMPOSSIBLE 을 좜λ ₯ν•œλ‹€.

μ§€ν›ˆμ΄κ°€ 미둜λ₯Ό νƒˆμΆœν•  수 μžˆλŠ” κ²½μš°μ—λŠ” κ°€μž₯ λΉ λ₯Έ νƒˆμΆœμ‹œκ°„μ„ 좜λ ₯ν•œλ‹€.

좜처:https://www.acmicpc.net/problem/4179

풀이

BFSλŠ” κ²°κ΅­ 거리순으둜 큐에 μŒ“μΈλ‹€. 큐에 빨리 λ“€μ–΄κ°€λ©΄ λ“€μ–΄κ°ˆμˆ˜λ‘ κ°€κΉŒμš΄ κ±°λ¦¬μž„μ„ μ•Œ 수 μžˆλ‹€.

BFS의 κΆ€λŠ” κ°™μ§€λ§Œ 세뢀적인 ν’€μ΄λŠ” λ‹€μ‹œ 풀어봐야 ν•  것 κ°™λ‹€.

#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
 
char board[1005][1005];
int dist_F[1005][1005];
int dist_J[1005][1005];
int dx[4] = {0, -1, 0, 1};
int dy[4] = {-1, 0, 1, 0};
int R, C;
queue<pair<int, int>> fire, runner;
 
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> R >> C;
    
    for(int i = 0; i < R; i++){
        for(int j = 0; j < C; j++){
            dist_F[i][j] = -1;
            dist_J[i][j] = -1;
        }
    }
    for(int i = 0; i < R; i++){
        for(int j = 0; j < C; j++){
            cin >> board[i][j];
            if(board[i][j] == 'F'){
                fire.push({i, j});
                dist_F[i][j] = 0;
            }
            if(board[i][j] == 'J'){
                runner.push({i, j});
                dist_J[i][j] = 0;
            }
        }
    }
    while(!fire.empty()){               // λΆˆμ— λŒ€ν•œ BFS
        auto cur = fire.front(); fire.pop();
        for(int dir=0; dir<4; dir++){
            int nx = cur.X + dx[dir];
            int ny = cur.Y + dy[dir];
            if(nx < 0 || nx >= R || ny < 0 || ny >= C) continue;
            if(board[nx][ny] == '#' || dist_F[nx][ny] >= 0) continue;
            dist_F[nx][ny] = dist_F[cur.X][cur.Y] + 1;
            fire.push({nx, ny});
        }
    }
    while(!runner.empty()){             // μ§€ν›ˆμ— λŒ€ν•œ BFS
        auto cur = runner.front(); runner.pop();
        for(int dir = 0; dir<4; dir++){
            int nx = cur.X + dx[dir];
            int ny = cur.Y + dy[dir];
            if(nx < 0 || nx >= R || ny < 0 || ny >= C){     // 끝에 λ„λ‹¬ν•˜λ©΄ νƒˆμΆœ
                cout << dist_J[cur.X][cur.Y]+1;
                return 0;
            }
            if(dist_J[nx][ny] >= 0 || board[nx][ny] == '#') continue;
            if(dist_F[nx][ny] != -1 && dist_F[nx][ny] <= dist_J[cur.X][cur.Y]+1) continue;  // μ€‘μš”!!!
            dist_J[nx][ny] = dist_J[cur.X][cur.Y] + 1;      // 뢈둜 인해 μ§€ν›ˆμ΄κ°€ 갈 수 μ—†λŠ” 경우 μ œμ™Έ
            runner.push({nx, ny});                          // 뢈이 μ•ˆμ§€λ‚˜κ°€λ„ -1이 기본값이기에 -1일 λ•ŒλŠ” μ§€λ‚˜κ°ˆ 수 μžˆλ„λ‘ 처리
        }
    }
    cout << "IMPOSSIBLE";
 
    return 0;
}