문제 링크 : www.acmicpc.net/problem/7569
내 풀이(2021.1.25.) : BFS
#include <iostream>
#include <queue>
#include <tuple>
using namespace std;
int N, M, H;
int map[100][100][100]; // [z][y][x] = [H][N][M]
int dz[6] = {1,-1,0,0,0,0};
int dy[6] = {0,0,-1,1,0,0};
int dx[6] = {0,0,0,0,-1,1};
queue<tuple<int, int, int>> q;
bool check() {
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) return false;
}
}
}
return true;
}
int main() {
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 >> map[i][j][k];
if (map[i][j][k] == 1) q.push(make_tuple(i, j, k));
}
}
}
int cnt = -1;
while (!q.empty()) {
int size = q.size();
for (int i = 0; i < size; i++) {
tuple<int,int,int> temp = q.front(); q.pop();
for (int j = 0; j < 6; j++) {
int nz = get<0>(temp) + dz[j];
int ny = get<1>(temp) + dy[j];
int nx = get<2>(temp) + dx[j];
if (nz<0 || ny<0 || nx<0 || nz>=H || ny>=N || nx>=M) continue;
if (map[nz][ny][nx] == 0) {
map[nz][ny][nx] = 1;
q.push(make_tuple(nz, ny, nx));
}
}
}
cnt++;
}
if (check()) cout << cnt;
else cout << -1;
return 0;
}
'알고리즘 > 완전 탐색' 카테고리의 다른 글
백준 16236번 : 아기 상어 (0) | 2021.01.29 |
---|---|
백준 9019번 : DSLR (0) | 2021.01.27 |
백준 2178번 : 미로 탐색 (0) | 2021.01.24 |
백준 2667번 : 단지번호붙이기 (0) | 2021.01.13 |
백준 15654번 : N과 M (5) (0) | 2021.01.05 |