코딩 공부/백준

[백준][C++] 4179 불!

김 정 환 2021. 4. 15. 17:50
반응형

www.acmicpc.net/problem/4179

 

4179번: 불!

입력의 첫째 줄에는 공백으로 구분된 두 정수 R과 C가 주어진다. 단, 1 ≤ R, C ≤ 1000 이다. R은 미로 행의 개수, C는 열의 개수이다. 다음 입력으로 R줄동안 각각의 미로 행이 주어진다.  각각의 문

www.acmicpc.net

 

 

 

알고리즘 종류

구현

BFS

 

 

 

사고 과정

지훈과 불의 움직임을 BFS로 표현해야 합니다. 그래서 2개의 큐를 이용해서 문제를 해결했습니다.

 

 

 

구현(C++)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <iostream>
#include <vector>
#include <queue>
 
using namespace std;
 
int h, w;
int time=0;
 
char mat[1001][1001];
int dir[4][2= {{1,0}, {0,1}, {-1,0}, {0,-1}};
 
queue<pair<intint> > F_q;
queue<pair<intint> > J_q;
 
 
bool isValid(int y, int x){
    return (y>=0 && y<h) && (x>=0 && x<w);
}
 
bool escape(){
    
    while(true){
        ++time;
        
        // Jihoon moves
        int J_size = J_q.size();
        while(J_size--){
            int y = J_q.front().first;
            int x = J_q.front().second;
            J_q.pop();
            
            if(mat[y][x] == 'F'continue;
            for(int d=0; d<4; d++){
                int ny = y + dir[d][0];
                int nx = x + dir[d][1];
                
                if(!isValid(ny, nx)) return true;
                
                if(mat[ny][nx] != '.'continue;
                mat[ny][nx] = 'J';
                
                J_q.push({ny, nx});
            }
        }
        
        // Fire moves
        int F_size = F_q.size();
        while(F_size--){
            int y = F_q.front().first;
            int x = F_q.front().second;
            F_q.pop();
            
            for(int d=0; d<4; d++){
                int ny = y + dir[d][0];
                int nx = x + dir[d][1];
                
                if(!isValid(ny, nx)) continue;
                if(mat[ny][nx] == '#'continue;
                if(mat[ny][nx] == 'F'continue;
                
                mat[ny][nx] = 'F';
                
                F_q.push({ny, nx});
            }
        }
        
        if(J_q.size() == 0return false;
    }
}
 
 
int main(void){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    
    cin >> h >> w;
    
    for(int i=0; i<h; i++){
        for(int j=0; j<w; j++){
            cin >> mat[i][j];
            
            if(mat[i][j] == 'J') J_q.push({i, j});
            if(mat[i][j] == 'F') F_q.push({i, j});
        }
    }
    
    if(escape()) cout << time << endl;
    else cout << "IMPOSSIBLE" << endl;
}
cs

 

 

 

시행착오

반응형