본문 바로가기

BOJ

백준 7569 / 토마토


BFS 연습문제


* 절대 2차원배열로 퉁치면 안되는 문제다!


처음엔 2차원배열로 받아서 위/아래로 갈경우 N만큼 증가/감소시켜서 풀어보려고 했으나


그렇게풀면


첫번째 박스의 마지막 행이 두번째 박스의 첫째 행과 연결된다는 큰 오류가 있음을 깨달았다.


그래서 3차원배열로 해결했다.





코드


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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include<stdio.h>
#include<iostream>
#include<queue>
#include<vector>
#include<tuple>
 
using namespace std;
 
 
int n, m, h;
int map[101][101][101];
int d[101][101][101];
bool check[101][101][101];
int dx[] = { 1,-1,0,0 };
int dy[] = { 0,0,1,-1 };
int dz[] = { 1,-1 };
queue<tuple<int,int,int>>q;
 
int main() {
 
    //freopen("Text.txt", "r", stdin);
 
    cin >> m >> n >> h;
 
    bool istherezero = true;
 
    for (int i = 0; i < h; i++) {
        for (int j = 0; j < n; j++) {
            for (int k = 0; k < m; k++) {
                cin >> map[j][k][i];
                if (map[j][k][i]== 1) {
                    q.push(make_tuple(j,k,i));
                    check[j][k][i] = true;
 
                }
                if (map[j][k][i] == 0) {
                    istherezero = false;
                }
 
            }
        }
    }
 
    if (istherezero == true) {
        cout << 0;
        return 0;
    }
 
    while (!q.empty()) {
    
        int x, y, z;
        tie(x, y, z) = q.front();
        q.pop();
 
        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
 
            if (nx >= 0 && ny >= 0 && nx < n && ny < m) {
                if (map[nx][ny][z] == 0 && check[nx][ny][z] == false) {
                    map[nx][ny][z] = 1;
                    check[nx][ny][z] = true;
                    d[nx][ny][z] = d[x][y][z] + 1;
                    q.push(make_tuple(nx, ny,z));
                }
            }
        }
 
        for (int i = 0; i < 2; i++) {
            int nz = z + dz[i];
            if (nz >= 0 && nz < h) {
                if (map[x][y][nz] == 0 && check[x][y][nz] == false) {
                    map[x][y][nz] = 1;
                    check[x][y][nz] = true;
                    d[x][y][nz] = d[x][y][z] + 1;
                    q.push(make_tuple(x, y,nz));
                }
            }
        }
    }
 
    int ans = -20000000;
    bool allgood = true;
    
    for (int k = 0; k < h; k++) {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                ans = max(ans, d[i][j][k]);
                if (map[i][j][k] == 0) {
                    allgood = false;
                }
                
            }
        }
    }
 
 
    if (allgood == false) {
        cout << -1;
    }
    else
        cout << ans;
 
}
 
cs


'BOJ' 카테고리의 다른 글

백준 2573 / 빙산  (0) 2019.01.04
백준 2589 / 보물섬  (0) 2019.01.02
백준 13913 / 숨바꼭질 4  (0) 2019.01.01
백준 7562 / 나이트의 이동  (0) 2019.01.01
백준 2468 / 안전 영역  (0) 2019.01.01