본문 바로가기
알고리즘/완전 탐색

백준 7569번 : 토마토

by Jason95 2021. 1. 25.

문제 링크 : 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