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<int, pair<int, int>> 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] = { 1, 0, 0, -1, 0 ,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 |