보글보글 개발일지
article thumbnail
Published 2021. 1. 28. 19:38
[백준/4179번][C++] 불! 알고리즘
반응형

www.acmicpc.net/problem/4179

 

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
profile

보글보글 개발일지

@보글

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!