[문제 링크] : 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;
}
'알고리즘' 카테고리의 다른 글
[알고리즘] 백준 1516 - 게임 개발 (C++) (0) | 2024.08.29 |
---|---|
[알고리즘] 백준 11779 - 최소비용 구하기 2 (C++) (0) | 2024.08.28 |
[알고리즘] 백준 1271 - 엄청난 부자2 (C++) (0) | 2024.08.26 |
[알고리즘] 백준 30804 - 과일 탕후루 (C++) (0) | 2024.08.25 |
[알고리즘] 백준 19944 - 뉴비의 기준은 뭘까? (C++) (0) | 2024.08.24 |