Backjoon Online Judge 

"7569번 : 토마토" 문제입니다.


문제 링크 : https://www.acmicpc.net/problem/7569



이전에 풀었던 '7576번 : 토마토' 문제에서 상자를 층으로 쌓는 기능만 추가된 문제입니다.

'7576번 : 토마토' 문제를 먼저 해결하고 온다면 현재 문제인 '7569번 : 토마토'는 쉽게 해결가능하다고 봅니다.

(참고링크 : http://rehu.tistory.com/20)


코드 부분도 "7576번 : 토마토" 문제에서 달라진 부분이 거의 없습니다.

아래 코드를 보고 비교한다면 쉽게 이해할 수 있을 것입니다.



코드는 C++로 작성하였습니다.

(단, 큐를 pair을 이용해 구현하여 C++ 11 이상에서만 정상작동 합니다.

 C++ 11 이하에서 작동되기를 원하시면 큐를 pair로 구현하는 대신 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
#include <iostream>
#include <queue>
 
#define Max 100
 
using namespace std;
typedef pair<intpair<intint>> pair3;
 
int main() {
    int M, N, H, x, y, z, tx, ty, tz;
    int box[Max][Max][Max] = { 0, };
    int result = 0;
    queue<pair3> q;
 
    cin >> M >> N >> H;
    for (int k = 0; k < H; k++) {
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                cin >> box[i][j][k];
                if (box[i][j][k] == 1) {
                    q.push({ i,{j,k} });
                }
            }
        }
    }
 
    int side[6= { 100-10 ,0 };
    while (!q.empty()) {
        x = q.front().first;
        y = q.front().second.first;
        z = q.front().second.second;
 
        if (box[x][y][z] == 2 + result)
            result++;
 
        for (int i = 0; i < 6; i++) {
            tx = x - side[i];
            ty = y - side[(i + 1) % 6];
            tz = z - side[(i + 2) % 6];
            if (0 <= tx && tx < N && 0 <= ty && ty < M && 0 <= tz && tz < H) {
                if (box[tx][ty][tz] == 0) {
                    box[tx][ty][tz] = 2 + result;
                    q.push(make_pair(tx, make_pair(ty, tz)));
                }
            }
        }
        q.pop();
    }
 
    for (int k = 0; k < H; k++) {
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                    if (box[i][j][k] == 0) {
                        result = -1;
                        break;
                }
            }
        }
    }
    cout << result << endl;
}
 



'Programming 문제풀이 > Backjoon Online Judge' 카테고리의 다른 글

2606번 : 바이러스  (0) 2018.05.28
2178번 : 미로탐색  (0) 2018.05.17
7576번 : 토마토  (0) 2018.05.16
2293번 : 동전 1  (0) 2018.05.15
10844번 : 쉬운 계단 수  (0) 2018.05.13