백준 7569번 토마토
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 | #include <iostream> #include <string> #include <vector> #include<queue> #include <algorithm> using namespace std; int H, M, N; int Box[101][101][101]; queue<pair<pair<int, int>, int> > tmt; int dy[6] = { 1,-1,0,0,0,0 }; int dx[6] = { 0,0,1,-1,0,0 }; int dz[6] = { 0,0,0,0,1,-1 }; int noTomato; bool AllRipe(void) { for (int i = 0; i < H; i++) for (int j = 0; j < N; j++) for (int k = 0; k < M; k++) if (Box[j][k][i] == 0) return 0; return true; } int Tomato(void) { if (tmt.empty()) return -1; int day = 0; while (!tmt.empty()) { int currentSize = tmt.size(); for (int i = 0; i < currentSize; i++) { int y = tmt.front().first.first; int x = tmt.front().first.second; int z = tmt.front().second; for (int i = 0; i < 6; i++) { int NextY = y + dy[i]; int NextX = x + dx[i]; int NextZ = z + dz[i]; if (0 <= NextY && NextY < N && 0 <= NextX && NextX < M && 0 <= NextZ && NextZ < H) { if (Box[NextY][NextX][NextZ] == 0) { Box[NextY][NextX][NextZ] = 1; tmt.push(make_pair(make_pair(NextY, NextX), NextZ)); } } } tmt.pop(); if (tmt.empty()&&AllRipe()) return day; else if (tmt.empty()&&!AllRipe()) { return -1; } } day++; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); 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) { tmt.push(make_pair(make_pair(i, j), k)); } } } } cout << Tomato(); return 0; } | cs |
3차원 배열이 너무 헷갈려서 중간에 삽질을 많이했네요.
푸는 개념은 2차원 배열일 때 BFS문제와 동일합니다.
currentsize를 하루가 지날때마다 갱신해주는 것에 주의합시다.
'알고리즘 > BAEKJOON' 카테고리의 다른 글
백준 16769번 Mixing Milk (0) | 2019.04.01 |
---|---|
백준 16398번 행성연결 (0) | 2019.03.27 |
백준 11049번 행렬 곱셈 순서 (0) | 2019.03.27 |
백준 13700번 완전 범죄 (0) | 2019.03.26 |
백준 11780번 플로이드2 (0) | 2019.03.26 |