728x90
728x90
https://www.acmicpc.net/problem/7569
난이도: solved.ac 골드 5
box라는 3차원 배열을 만들고, 해당 배열에 입력을 받았다.
그리고 먼저 box[i][j][k] = 1인 곳을 큐에 담고, 큐에서 하나씩 꺼내 주위 위, 아래, 오른쪽, 왼쪽, 앞, 뒤 중 0인 곳은 값을 1씩 증가시켜 저장하였다.
0일차를 1로 시작했으므로 box[i][j][k]가 가장 큰 곳에서 1을 뺀 값을 출력하도록 해주었다.
그리고 -1로 둘러 쌓여 익지 못한 곳 (0)인 곳이 있으면 -1을 출력하도록 해주었다.
#include <bits/stdc++.h>
using namespace std;
int box[100][100][100];
typedef pair<int, pair<int, int>> cor;
queue<cor> q;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int N, M, H, i, j, k;
cin >> M >> N >> H;
for (i = 0; i < H; i++)
for (j = 0; j < N; j++)
for (k = 0; k < M; k++) {
cin >> box[i][j][k];
if (box[i][j][k] == 1)
q.push(make_pair(i, make_pair(j, k)));
}
int dx[6] = { 1,0,-1,0,0,0 };
int dy[6] = { 0,1,0,-1,0,0 };
int dz[6] = { 0,0,0,0,1,-1 };
while (!q.empty()) {
cor qfront = q.front();
q.pop();
int curz = qfront.first;
int cury = qfront.second.first;
int curx = qfront.second.second;
int order = box[curz][cury][curx];
for (int dir = 0; dir < 6; dir++) {
int nz = curz + dz[dir];
int ny = cury + dy[dir];
int nx = curx + dx[dir];
if (nz >= 0 && nz < H && ny >= 0 && ny < N && nx >= 0 && nx < M) {
if (!box[nz][ny][nx]) {
q.push(make_pair(nz, make_pair(ny, nx)));
box[nz][ny][nx] = order + 1;
}
}
}
}
int max = 0;
for (i = 0; i < H; i++)
for (j = 0; j < N; j++)
for (k = 0; k < M; k++) {
if (box[i][j][k]) {
if (box[i][j][k] > max)
max = box[i][j][k];
}
else {
cout << "-1";
return 0;
}
}
cout << max - 1;
}
반응형