- 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;
}