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

 

7569번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100, 1 ≤ H ≤ 100 이다. 둘째 줄부터는 가장 밑의 상자부터 가장 위의 상자까지에 저장된 토마토들의 정보가 주어진다. 즉, 둘째 줄부터 N개의 줄에는 하나의 상자에 담긴 토마토의 정보가 주어진다. 각 줄에는 상자 가로줄에 들어있는 토마

www.acmicpc.net

7576번 문제와 거의 똑같은 문제인데 범위가 조금 더 적고 대신에 상자가 3차원이다.

처음에 똑같은 상자가 h만큼 있는걸로 문제를 오해해서 잘못 풀었었다...;;

7576번 문제에서 3차원으로만 바꿔주면 되지만 나는 c++에 아직 익숙하지 않아서 조금 어려움을 겪었다ㅠㅠ

 

먼저 큐에 저장 하는 방식

2차원에서는 x와 y좌표만 넣어주면 되므로 pair를 사용하였지만 이 문제에서는 z좌표 까지 함께 넣어야한다.

처음에는 tuple을 사용하려 했지만 값을 받아오는 방법이 불편해서 다들 pair를  이중으로 쓴다길래 따라했다..

 

queue<pair<pair<int,int>int>> q;

 

이런식으로 pair를 중첩해서 넣어줬다. (x, y) 가 먼저 pair 가 되고, (x, y) 가 다시 z와 pair가 된다.

이렇게 pair만 3차원 방식에 맞게 구현해주면 나머지는 2차원 토마토와 거의 똑같다.

 

 

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
#include <cstdio>
#include <queue>
using namespace std;
int n,m,h;
int box[100][100][100];
int day[100][100][100];
int dx[] = {0,0,1,-1,0,0};
int dy[] = {1,-1,0,0,0,0};
int dz[] = {0,0,0,0,1,-1};
 
 
int main() {
 
    scanf("%d %d %d"&m, &n, &h);
    queue<pair<pair<int,int>,int> > q;
 
 
    for(int k=0; k<h; k++) {
        for(int i=0; i<n; i++) {
            for(int j=0; j<m; j++) {
 
                scanf("%d"&box[i][j][k]);
                day[i][j][k] = -1;
                //익은 토마토인 경우 큐에 넣는다.
                if(box[i][j][k] == 1) {
                    q.push(make_pair(make_pair(i,j),k));
                    day[i][j][k] = 0;
                }
             
            }
        }
    }
  
 
    while(!q.empty()) {
        int x = q.front().first.first;
        int y = q.front().first.second;
        int z = q.front().second;
        q.pop();
 
        for(int i=0; i<6; i++) {
            int nx = x+dx[i];
            int ny = y+dy[i];
            int nz = z+dz[i];
            
            //범위 체크
            if(nx < 0 || ny < 0 || nx >= n || ny >= m) continue;
            if(nz < 0 || nz >= h) continue;
 
            //안익은 토마토 && 아직 방문 안함
            if(box[nx][ny][nz] == 0 && day[nx][ny][nz] == -1) {
                q.push(make_pair(make_pair(nx,ny),nz));
                day[nx][ny][nz] = day[x][y][z] + 1;
            }
        }
 
    }
 
 
    int ans = 0;
    for(int i=0; i<n; i++) {
        for(int j=0; j<m; j++) {
            for(int k=0; k<h; k++) {
                if(box[i][j][k] == 0 && day[i][j][k] == -1) {
                    ans = -1;
                    break;
                }
 
                if(ans < day[i][j][k])
                    ans = day[i][j][k];
            }
            if(ans == -1break;
            
        }
        if(ans == -1break;
    }
 
    printf("%d", ans);
 
    return 0;
}
Colored by Color Scripter
 

'BOJ' 카테고리의 다른 글

[BOJ] 14501. 퇴사  (0) 2019.06.27
[BOJ] 1697. 숨바꼭질  (0) 2019.06.27
[BOJ] 7576. 토마토  (0) 2019.06.27
[BOJ] 11724. 연결 요소의 개수  (0) 2019.06.27
[BOJ] 2178. 미로 탐색  (0) 2019.06.25

+ Recent posts