https://www.acmicpc.net/problem/7569
기존의 토마토 문제가 3차원으로 확장된 것! 원래 이 문제를 풀고있었는데 잘 안 풀려서 2차원 토마토 먼저 풀고 이거 풀었다
3차원에서는 for문으로 입력받을 때, 높이->세로->가로 순서다
(2차원은 세로->가로)
#include <iostream>
#include <queue>
#include <tuple>
using namespace std;
/*
3차원 토마토
*/
int M, N, H;
int map[100][100][100];
int dx[6] = { 1, -1, 0, 0, 0, 0 };
int dy[6] = { 0, 0, 1, -1, 0, 0 };
int dz[6] = { 0, 0, 0, 0, 1, -1 };
queue<tuple<int, int, int>> q;
void bfs() {
while (!q.empty()) {
int zz = get<0>(q.front());
int yy = get<1>(q.front());
int xx = get<2>(q.front());
q.pop();
for (int i = 0; i < 6; i++) {
int nz = zz + dz[i];
int ny = yy + dy[i];
int nx = xx + dx[i];
if (nx >= 0 && nx < M && ny >= 0 && ny < N && nz >= 0 && nz < H && map[nz][ny][nx] == 0) {
map[nz][ny][nx] = map[zz][yy][xx] + 1;
q.push({ nz, ny, nx });
}
}
}
}
int main() {
int ans = 0;
cin >> M >> N >> H;
for (int i = 0; i < H; i++) {
for (int j = 0; j < N; j++) {
for (int k = 0; k < M; k++) {
cin >> map[i][j][k];
if (map[i][j][k] == 1)
q.push({ i, j, k });
}
}
}
bfs();
for (int i = 0; i < H; i++) {
for (int j = 0; j < N; j++) {
for (int k = 0; k < M; k++) {
if (map[i][j][k] == 0) {
cout << -1;
return 0;
}
if (map[i][j][k] > ans)
ans = map[i][j][k];
}
}
}
cout << ans - 1;
return 0;
}