창고에 보관된 토마토가 모두 익는데 걸리는 최소 일수를 구하는 문제.
https://www.acmicpc.net/source/72430248
cpp code
#include <iostream>
#include <queue>
#include <tuple>
using namespace std;
using lld = long long int;
using ulld = unsigned long long int;
using pii = pair<int, int>;
using tiii = tuple<int, int, int>;
const int dx[6] = { -1, 1, 0, 0, 0, 0 };
const int dy[6] = { 0, 0, -1, 1, 0, 0 };
const int dz[6] = { 0, 0, 0, 0, -1, 1 };
int M, N, H;
int A[100][100][100];
int ans;
int main(void) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
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 >> A[i][j][k];
}
}
}
queue<tiii> next_Q;
for (int i = 0; i < H; i++) {
for (int j = 0; j < N; j++) {
for (int k = 0; k < M; k++) {
if (A[i][j][k] == 1) {
next_Q.emplace(i, j, k);
}
}
}
}
while (true) {
queue<tiii> Q(next_Q);
next_Q = queue<tiii>();
while (!Q.empty()) {
int cur_z = get<0>(Q.front());
int cur_y = get<1>(Q.front());
int cur_x = get<2>(Q.front());
Q.pop();
for (int i = 0; i < 6; i++) {
int nz = cur_z + dz[i];
int ny = cur_y + dy[i];
int nx = cur_x + dx[i];
if (nz < 0 || nz > H - 1 || ny < 0 || ny > N - 1 || nx < 0 || nx > M - 1) continue;
if (A[nz][ny][nx] != 0) continue;
A[nz][ny][nx] = 1;
next_Q.emplace(nz, ny, nx);
}
}
if (next_Q.empty()) break;
ans++;
}
for (int i = 0; i < H; i++) {
for (int j = 0; j < N; j++) {
for (int k = 0; k < M; k++) {
if (A[i][j][k] == 0) {
cout << "-1\n";
return 0;
}
}
}
}
cout << ans << endl;
return 0;
}