카테고리 없음

[백준 00000] 토마토 (C++)

BE_개발자 2023. 12. 28. 22:40
728x90
반응형
#include<iostream>
#include<queue>
#include<tuple>
#define IN(Z, Y, X) Z >=0 && Z < H && Y >=0 && Y < N && X >=0 && X < M 
#define F first
#define S second
#define T third

using namespace std;

int N, M, H, unriped, ans;
queue<tuple<int, int, int>> Q;
int board[100][100][100];
int tomato[100][100][100];
int dz[6] = { 0, 0, 0, 0, 1, -1 };
int dy[6] = { 0, 1, 0, -1, 0, 0 };
int dx[6] = { 1, 0, -1, 0, 0, 0 };

//bfs로 순차적 탐색
void BFS() {

	while (!Q.empty()) {
		tuple<int, int, int> cur = { get<0>(Q.front()), get<1>(Q.front()), get<2>(Q.front())};
		Q.pop();
		int cz = get<0>(cur);
		int cy = get<1>(cur);
		int cx = get<2>(cur);

		for (int i = 0; i < 6; i++) {
			int nz = get<0>(cur) + dz[i];
			int ny = get<1>(cur) + dy[i];
			int nx = get<2>(cur) + dx[i];
			if (IN(nz, ny, nx) && tomato[nz][ny][nx] == -1 && !board[nz][ny][nx]) {
				tomato[nz][ny][nx] = 1 + tomato[cz][cy][cx];
				Q.push({ nz, ny, nx });
				unriped--;
			}
		}
	}
}

int main(void) {
	cin.tie(0);
	cout.tie(0);
	ios_base::sync_with_stdio(0);

	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 >> board[i][j][k];
				if (board[i][j][k] == 1) {
					Q.push({ i, j, k });
					tomato[i][j][k] = 0;
				}
				else if (board[i][j][k] == 0) {
					tomato[i][j][k] = -1;
					unriped++;
				}
				else continue;
			}
		}
	
	}
	BFS();
	
	for (int i = 0; i < H; i++) {
		for (int j = 0; j < N; j++) {
			for (int k = 0; k < M; k++) {
				ans = max(ans, tomato[i][j][k]);
			}
		}
	}

	if (!unriped) cout << ans;
	else cout << -1;
	
}
728x90
반응형