반응형
4179번: 불!
입력의 첫째 줄에는 공백으로 구분된 두 정수 R과 C가 주어진다. 단, 1 ≤ R, C ≤ 1000 이다. R은 미로 행의 개수, C는 열의 개수이다. 다음 입력으로 R줄동안 각각의 미로 행이 주어진다. 각각의 문
www.acmicpc.net
불의 경로와 지훈이의 경로를 각각 체크하며 각 칸에 도달하는데 걸리는 시간을 구한다.
만약 지훈이가 이동하려는 칸까지 가는 시간이 불이 그 칸까지 가는 시간보다 오래 걸린다면
지훈이는 그 칸으로 이동하지 못한다.
지훈이의 경로에서 범위를 벗어난다면, 탈출에 성공한 것이다.
대입 연산자 = 를 써야하는데, ==을 써서 오류 찾는데 한참 걸렸다..
#include <iostream>
#include <queue>
using namespace std;
string board[1002];
int jh[1002][1002];
int fire[1002][1002];
int n,m;
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
int main(void){
ios_base::sync_with_stdio(0);
cin.tie(0);
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
jh[i][j]=-1;
fire[i][j]=-1;
}
}
for(int i=0;i<n;i++)
cin>>board[i];
/**불의 경로 체크**/
queue <pair<int,int>> q1;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(board[i][j]=='F'){
q1.push({i,j});
fire[i][j]=0;
}
}
}
while(!q1.empty()){
pair<int,int> cur1=q1.front();
q1.pop();
for(int i=0;i<4;i++){
int nx=cur1.first+dx[i];
int ny=cur1.second+dy[i];
if(nx<0||ny<0||nx>=n||ny>=m) continue;
if(board[nx][ny]=='#'||fire[nx][ny]!=-1) continue;
fire[nx][ny]=fire[cur1.first][cur1.second]+1;
q1.push({nx,ny});
}
}
/**지훈이의 경로 체크**/
queue <pair<int,int>> q2;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(board[i][j]=='J'){
q2.push({i,j});
jh[i][j]=0;
}
}
}
while(!q2.empty()){
pair<int,int> cur2=q2.front();
q2.pop();
for(int i=0;i<4;i++){
int nx=cur2.first+dx[i];
int ny=cur2.second+dy[i];
if(nx<0||nx>=n||ny<0||ny>=m){//탈출 성공
cout<<jh[cur2.first][cur2.second]+1;
return 0;
}
if(jh[nx][ny]!=-1||board[nx][ny]=='#') continue;
if(fire[nx][ny]<=jh[cur2.first][cur2.second]+1&&fire[nx][ny]!=-1) continue;
//지훈이가 (nx,ny)에 도달하는 시간:jh[cur2.first][cur2.second]+1
jh[nx][ny]=jh[cur2.first][cur2.second]+1;
q2.push({nx,ny});
}
}
cout<<"IMPOSSIBLE";
}
반응형
'알고리즘' 카테고리의 다른 글
[백준/1267번][C++] 핸드폰 요금 (0) | 2021.02.03 |
---|---|
[백준/1692번][C++] 곱셈 (0) | 2021.01.29 |
[백준/2178번][C++] 미로 탐색 (0) | 2021.01.28 |
[백준/1926번][C++] 그림 (0) | 2021.01.28 |
[백준/10773번][C++] 제로 (0) | 2021.01.25 |