μ§νμ΄λ λ―Έλ‘μμ μΌμ νλ€. μ§νμ΄λ₯Ό λ―Έλ‘μμ νμΆνλλ‘ λμμ£Όμ!
λ―Έλ‘μμμ μ§νμ΄μ μμΉμ λΆμ΄ λΆμ μμΉλ₯Ό κ°μν΄μ μ§νμ΄κ° λΆμ νκΈ°μ μ νμΆν μ μλμ§μ μ¬λΆ, κ·Έλ¦¬κ³ μΌλ§λ 빨리 νμΆν μ μλμ§λ₯Ό κ²°μ ν΄μΌνλ€.
μ§νμ΄μ λΆμ λ§€ λΆλ§λ€ νμΉΈμ© μνλλ μμ§μΌλ‘(λΉμ€λ¬νκ² μ΄λνμ§ μλλ€)Β μ΄λνλ€.
λΆμ κ° μ§μ μμ λ€ λ°©ν₯μΌλ‘ νμ°λλ€.
μ§νμ΄λ λ―Έλ‘μ κ°μ₯μ리μ μ ν 곡κ°μμ νμΆν μ μλ€.
μ§νμ΄μ λΆμ λ²½μ΄ μλ 곡κ°μ ν΅κ³Όνμ§ λͺ»νλ€.
μ λ ₯μ 첫째 μ€μλ 곡백μΌλ‘ ꡬλΆλ λ μ μ Rκ³Ό Cκ° μ£Όμ΄μ§λ€. λ¨, 1 β€ R, C β€ 1000 μ΄λ€. Rμ λ―Έλ‘ νμ κ°μ, Cλ μ΄μ κ°μμ΄λ€.
λ€μ μ λ ₯μΌλ‘ Rμ€λμ κ°κ°μ λ―Έλ‘ νμ΄ μ£Όμ΄μ§λ€.
κ°κ°μ λ¬Έμλ€μ λ€μμ λ»νλ€.
#
: λ²½.
: μ§λκ° μ μλ 곡κ°J
: μ§νμ΄μ λ―Έλ‘μμμ μ΄κΈ°μμΉ (μ§λκ° μ μλ 곡κ°)F
: λΆμ΄ λ 곡κ°
Jλ μ λ ₯μμ νλλ§ μ£Όμ΄μ§λ€.
μ§νμ΄κ° λΆμ΄ λλ¬νκΈ° μ μ λ―Έλ‘λ₯Ό νμΆ ν μ μλ κ²½μ° IMPOSSIBLE μ μΆλ ₯νλ€.
μ§νμ΄κ° λ―Έλ‘λ₯Ό νμΆν μ μλ κ²½μ°μλ κ°μ₯ λΉ λ₯Έ νμΆμκ°μ μΆλ ₯νλ€.
#include <bits/stdc++.h>
using namespace std;
int main()
{
int r, c;
cin >> r >> c;
string str[1002];
int dx[4] = {0, 0, -1, 1};
int dy[4] = {1, -1, 0, 0};
queue<pair<int, int>> exodus;
queue<pair<int, int>> fire;
int fDist[1002][1002];
int jDist[1002][1002];
for(int i=0;i<r;i++) {
fill(fDist[i], fDist[i]+c, -1);
fill(jDist[i], jDist[i]+c, -1);
}
for(int i=0;i<r;i++) cin >> str[i];
for(int i=0;i<r;i++) {
for(int j=0;j<c;j++){
if(str[i][j] == 'J') {
exodus.push({i, j});
jDist[i][j] = 0;
}
if(str[i][j] == 'F') {
fire.push({i, j});
fDist[i][j] = 0;
}
}
}
while(!fire.empty()) {
pair<int, int> curF = fire.front();
fire.pop();
for(int i=0;i<4;i++) {
int fx = curF.first + dx[i];
int fy = curF.second + dy[i];
// λΆ μμ§μ΄κΈ°
// 1) λΆμ΄ κ°μ§ λͺ»νλ κ³³
if(fx < 0 || fx >= r || fy < 0 || fy >=c) continue;
// λ²½μ΄κ±°λ μ΄λ―Έ κ°λ κ³³
if(str[fx][fy] == '#' || fDist[fx][fy] >=0) continue;
fDist[fx][fy] = fDist[curF.first][curF.second] + 1;
fire.push({fx, fy});
}
}
while(!exodus.empty()) {
pair<int, int> curJ = exodus.front();
exodus.pop();
for(int i=0;i<4;i++) {
int jx = curJ.first + dx[i];
int jy = curJ.second + dy[i];
if(jx < 0 || jx >= r || jy < 0 || jy >=c) {
cout << jDist[curJ.first][curJ.second] + 1;
return 0;
}
// μ§νμ΄ μμ§μ΄κΈ°
// 1) μ§νμ΄κ° κ°μ§ λͺ»νλ κ³³
if(str[jx][jy] == '#' || jDist[jx][jy] >= 0) continue;
// μ΄λ―Έ fireκ° λ€λ
κ° κ³³μ΄κ±°λ, λμ°©ν μμ μ λΆμ΄ λμμ λμ°©νκ±°λ, νΉμ μμ λ³΄λ€ λΆμ΄ λ 빨리 λμ°©νλ μ리μ κ° μ μμ.
if(fDist[jx][jy]!=-1 && fDist[jx][jy] <= jDist[curJ.first][curJ.second]+1) continue;
jDist[jx][jy] = jDist[curJ.first][curJ.second] + 1;
exodus.push({jx, jy});
}
}
cout << "IMPOSSIBLE";
return 0;
}