알고리즘/BOJ
[c/c++] 백준/BOJ 5427번 문제 - 불
wonjun.Aden
2022. 3. 29. 14:33
https://www.acmicpc.net/problem/5427
5427번: 불
상근이는 빈 공간과 벽으로 이루어진 건물에 갇혀있다. 건물의 일부에는 불이 났고, 상근이는 출구를 향해 뛰고 있다. 매 초마다, 불은 동서남북 방향으로 인접한 빈 공간으로 퍼져나간다. 벽에
www.acmicpc.net
문제


문제풀이
#include <bits/stdc++.h>
using namespace std;
string board[1001];
int f_dist[1002][1002];
int j_dist[1002][1002];
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
//테스트 케이스의 수
int n;
cin >> n;
while(n--){
int x,y;
bool exit = false;
cin >> x >> y;
for(int i=0;i<y;i++){
cin >> board[i];
}
for(int i=0;i < y;i++){
fill(f_dist[i],f_dist[i]+x,0);
fill(j_dist[i],j_dist[i]+x,0);
}
queue<pair<int,int>> fq;
queue<pair<int,int>> jq;
for(int i=0;i<y;i++){
for(int j=0;j<x;j++){
if(board[i][j] == '@'){
jq.push({i,j});
j_dist[i][j]=1;
}else if(board[i][j] == '*'){
fq.push({i,j});
f_dist[i][j]=1;
}
}
}
//불 BFS
while(!fq.empty()){
auto cur = fq.front(); fq.pop();
for(int dir =0;dir <4;dir++){
int nx = cur.first + dx[dir];
int ny = cur.second + dy[dir];
if(nx < 0 || nx >= y || ny < 0 || ny >=x) continue;
if(board[nx][ny] == '#') continue;
if(f_dist[nx][ny]) continue;
f_dist[nx][ny] = f_dist[cur.first][cur.second] +1;
fq.push({nx,ny});
}
}
//상근이 불
while(!jq.empty() && !exit){
auto cur = jq.front(); jq.pop();
for(int dir =0;dir <4;dir++){
int nx = cur.first + dx[dir];
int ny = cur.second + dy[dir];
if(nx < 0 || nx >= y || ny < 0 || ny >=x){
cout << j_dist[cur.first][cur.second] << '\n';
exit = true;
break;
}
if(board[nx][ny] == '#') continue;
if(j_dist[nx][ny]) continue;
if(f_dist[nx][ny] != 0 && f_dist[nx][ny] <= j_dist[cur.first][cur.second]+1) continue;
j_dist[nx][ny] = j_dist[cur.first][cur.second] +1;
jq.push({nx,ny});
}
}
if(!exit) cout << "IMPOSSIBLE" << '\n';
}
return 0;
}
/*
1
4 4
####
#@*#
#..#
#..#
1
3 3
###
#@#
###
*/
문제의 포인트
- 불이 퍼지는 시간을 먼저 계산 후 상근이가 불보다 빠르게 탈출할 수 있는지 계산해야함.
반응형