반응형
7576번 토마토 문제에 세로축만 추가된 것으로 마찬가지로 BFS를 사용하면 된다.
풀이는 이전 글을 참고하자.
#include <iostream>
#include <queue>
#include <tuple>
using namespace std;
int M, N, H, a[100][100][100]={};
queue<tuple<int, int , int>> q;
int dh[6]={-1, 1, 0, 0, 0, 0};
int dn[6]={0, 0, -1, 1, 0, 0};
int dm[6]={0, 0, 0, 0, -1, 1};
bool isDone() {
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) return false;
return true;
}
int getMax() {
int res=0;
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]>res) res=a[i][j][k];
return res;
}
void BFS() {
while(!q.empty()) {
int ch=get<0>(q.front()), cn=get<1>(q.front()), cm=get<2>(q.front());
q.pop();
for(int i=0; i<6; i++) {
int nh=ch+dh[i], nn=cn+dn[i], nm=cm+dm[i];
if(nh>=0 && nh<H && nn>=0 && nn<N && nm>=0 && nm<M && a[nh][nn][nm]==0) {
q.push(make_tuple(nh, nn, nm));
a[nh][nn][nm]=a[ch][cn][cm]+1;
}
}
}
}
int main() {
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];
if(a[i][j][k]==1)
q.push(make_tuple(i, j, k));
}
}
}
BFS();
if(isDone()) cout << getMax()-1;
else cout << -1;
}
'PS' 카테고리의 다른 글
[PS] 백준 1463번 - 1로 만들기 (0) | 2023.05.17 |
---|---|
[PS] 백준 2629번 - 양팔저울 (0) | 2023.05.17 |
[PS] 백준 2468번 - 안전 영역 (0) | 2023.05.17 |
[PS] 백준 2644번 - 촌수계산 (0) | 2023.05.17 |
[PS] 백준 5014번 - 스타트링크 (0) | 2023.05.16 |