https://www.acmicpc.net/problem/7569


처음에 토마토가 들어가 있는 좌표를 queue에 push합니다.


그리고 queue에 있는 것을 하나 씩 꺼내서 bfs합니다.


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
#include <iostream>
#include <queue>
using namespace std;
 
int map[100][100][100];
int h,n,m;
 
bool chk(){
    for(int i = 0; i < h; i++){
        for(int j = 0; j < n; j++){
            for(int k = 0; k < m; k++){
                if(map[i][j][k] == 0return true;
            }
        }
    }
    return false;
}
 
int main(){
    ios_base::sync_with_stdio(false);
    
    bool visited[100][100][100= {0};
    int dz[6= {1,-1,0,0,0,0};
    int dy[6= {0,0,1,-1,0,0};
    int dx[6= {0,0,0,0,1,-1};
    queue<pair<int,pair<int,int> > > q;
    int day = -1;
    
    cin >> m >> n >> h;
    
    for(int i = 0; i < h; i++){
        for(int j = 0; j < n; j++){
            for(int k = 0; k < m; k++){
                cin >> map[i][j][k];
                if(map[i][j][k] == 1){
                    q.push({i,{j,k}});
                    visited[i][j][k] = true;
                }
            }
        }
    }
    
    if(!chk()){
        cout << 0;
        return 0;
    }
    
    while(!q.empty()){
        int size = q.size();
        day+=1;
        
        for(int i = 0; i < size; i++){
            int x = q.front().second.second, y = q.front().second.first, z = q.front().first;
            q.pop();
            for(int j = 0; j < 6; j++){
                int xx = x + dx[j], yy = y + dy[j], zz = z + dz[j];
                if(xx >= m || yy >= n || zz >= h || xx < 0 || yy < 0 || zz < 0continue;
                if(visited[zz][yy][xx] || map[zz][yy][xx] == -1continue;
                visited[zz][yy][xx] = true;
                map[zz][yy][xx] = 1;
                q.push({zz,{yy,xx}});
            }
        }
        
    }
    
    if(chk())    cout << -1;
    else cout << day;
    
}
cs


반응형

'프로그래밍 > 문제풀이' 카테고리의 다른 글

[bfs, dfs] 백준 2667 단지번호붙이기  (0) 2019.03.24
[dfs] 백준 2606 바이러스  (0) 2019.03.22
[bfs] 라비다 1052 maze problem  (0) 2019.03.18
[dp] 백준 1495 기타리스트  (0) 2019.02.20
[dp] 백준 1309 동물원  (0) 2019.02.02

+ Recent posts