[백준 00000] 토마토 (C++)카테고리 없음2023. 12. 28. 22:40
Table of Contents
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
반응형
@BE_개발자 :: 경이로운 개발일기
경이로운 BE 개발자가 되기 위한 프로그래밍 공부 기록장
도움이 되었다면 "❤️" 또는 "👍🏻" 해주세요! 문의는 아래 이메일로 보내주세요.