[백준 7569번] 토마토

2017. 6. 8. 01:39알고리즘/백준

반응형

 

 

 

 

 

 

풀이


7576번 문제랑 똑같은데 Z축이 하나더 추가된 문제이다.

 

기본적인 BFS로 풀면서 한번 갈때마다 카운트를 세주면 풀 수 있는 문제

 

Z축을 [a][b][c] 중 a로할지 c로 할지 잘 정해주고, Que사이즈, 입력받는 배열의 사이즈만 잘 고려해주면 된다.

 

 

 

코드


 

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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include <iostream>
using namespace std;
 
int que_x[1000001];
int que_y[1000001];
int que_z[1000001];
int head_x, tail_x, head_y, tail_y,head_z,tail_z;
int n, m, h;
long long box[102][102][102];
 
void push(int x, int y, int z) {
    que_x[tail_x++= x;
    que_y[tail_y++= y;
    que_z[tail_z++= z;
    tail_x %= 1000001;
    tail_y %= 1000001;
    tail_z %= 1000001;
}
 
int pop_x() {
    int xx = que_x[head_x];
    head_x++;
    head_x %= 1000001;
    return xx;
}
 
int pop_y() {
    int yy = que_y[head_y];
    head_y++;
    head_y %= 1000001;
    return yy;
}
 
int pop_z() {
    int zz = que_z[head_z];
    head_z++;
    head_z %= 1000001;
    return zz;
 
}
 
void bfs() {
    while (head_x != tail_x) {
        int x = pop_x();
        int y = pop_y();
        int z = pop_z();
 
        if (x + 1 <= n - 1 && box[z][x + 1][y] == 0) {
            push(x + 1, y, z);
            box[z][x + 1][y] = box[z][x][y] + 1;
        }
        if (x - 1 >= 0 && box[z][x - 1][y] == 0) {
            push(x - 1, y, z);
            box[z][x - 1][y] = box[z][x][y] + 1;
        }
        if (y + 1 <= m - 1 && box[z][x][y + 1== 0) {
            push(x, y + 1, z);
            box[z][x][y + 1= box[z][x][y] + 1;
        }
        if (y - 1 >= 0 && box[z][x][y - 1== 0) {
            push(x, y - 1, z);
            box[z][x][y - 1= box[z][x][y] + 1;
        }
        if (z - 1 >= 0 && box[z-1][x][y] == 0) {
            push(x, y, z-1);
            box[z - 1][x][y] = box[z][x][y] + 1;
        }
        if (z + 1 <= h - 1 && box[z+1][x][y] == 0) {
            push(x, y, z + 1);
            box[z+1][x][y] = box[z][x][y] + 1;
        }
    }
}
 
int main() {
    ios::sync_with_stdio(false);
    int flag = 0, compare_flag = 0;
    head_x = 0;
    tail_x = 0;
    head_y = 0;
    tail_y = 0;
    head_z = 0;
    tail_z = 0;
 
    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 >> box[i][j][k];
                if (box[i][j][k] == 1) {
                    flag++;
                    push(j, k, i);
                }
            }
        }
    }
 
    bfs();
    int Max = 0;
    for (int i = 0; i < h; i++) {
        for (int j = 0; j < n; j++) {
            for (int k = 0; k < m; k++) {
                if (box[i][j][k] != 0 && box[i][j][k] != -1) {
                    compare_flag++;
                }
                if (box[i][j][k] == 0) {
                    cout << -1 << '\n';
                    return 0;
                }
                else if (box[i][j][k] > Max){
                    Max = box[i][j][k];
                }
            }
        }
    }
 
    if (compare_flag == flag) {
        cout << 0 << '\n';
        return 0;
    }
    cout << Max - 1 << '\n';
    return 0;
}
cs

 

 

반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 11727번] 2xn 타일링 2  (0) 2017.06.13
[백준 10972번] 다음 순열  (0) 2017.06.09
[백준 1005번] ACM Craft  (0) 2017.06.01
[백준 2589번] 보물섬  (0) 2017.05.21
[백준 1912번] 연속합  (0) 2017.05.19