https://www.acmicpc.net/problem/7569
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
struct Dir {
int x;
int y;
int z;
};
using namespace std;
int arr[101][101][101] = { 0, };
int check[101][101][101] = { 0, };
int row, col, height;
Dir dir[6] = { {1, 0, 0}, {0, 1, 0}, {0, -1, 0}, {-1, 0, 0}, {0, 0, 1}, {0, 0, -1} };
queue<Dir> q;
int main() {
cin >> col >> row >> height;
int cnt = 0;
int MAX = 0;
for (int h = 0; h < height; h++) {
for (int j = 0; j < row; j++) {
for (int k = 0; k < col; k++) {
int temp;
cin >> temp;
if (temp == 1) q.push({ j, k, h });
else if (temp == 0) cnt += 1;
arr[h][j][k] = temp;
}
}
}
if (cnt == 0) { // 이미 토마토가 다 익음.
cout << 0;
}
else {
// bfs
while (!q.empty()) {
Dir now = q.front();
q.pop();
check[now.z][now.x][now.y] = 1;
for (int i = 0; i < 6; i++) {
// 다음으로 가는 좌표
int nextX = now.x + dir[i].x;
int nextY = now.y + dir[i].y;
int nextZ = now.z + dir[i].z;
// 이 좌표들이 익을 수 있는가?
// 범위를 벗어나거나 이미 방문한 적 있는 노드
if (nextX < 0 || nextY < 0 || nextZ < 0 || nextX >= row || nextY >= col || nextZ >= height || check[nextZ][nextX][nextY]) continue;
if (arr[nextZ][nextX][nextY] == -1) continue;
if (arr[nextZ][nextX][nextY] == 1) continue;
arr[nextZ][nextX][nextY] = arr[now.z][now.x][now.y] + 1;
check[nextZ][nextX][nextY] = 1;
q.push({ nextX, nextY, nextZ });
}
}
bool flag = true;
for (int h = 0; h < height; h++) {
for (int j = 0; j < row; j++) {
for (int k = 0; k < col; k++) {
if (arr[h][j][k] == 0) flag = false;
if (arr[h][j][k] > MAX) MAX = arr[h][j][k];
}
}
}
if (flag) {
cout << MAX - 1;
}
else {
cout << -1;
}
}
return 0;
}
2차원 토마토를 넘어 3차원 토마토를 풀어보았다.
C++은 3차원이 있어서 간단하게 구현했다. 코드를 짜면서 주의할 점은 up,down으로 가는 것만 신경쓰면 될 것 같다.
*예외처리를 1개 놓쳐서 개고생함...
탈출은 왜 안푸시고 토마토 푸셨나요?!