개발/백준
[백준] 7569번. 토마토 (C++)
yun000
2024. 11. 8. 18:20
문제
https://www.acmicpc.net/problem/7569
해결
3차원 BFS 문제이다.
약간 아리까리해도 침착하게 보면 금방 풀 수 있다!
INPUT
토마토 정보를 입력 받는 동시에 익은 토마토는 queue에 넣는다.
BFS
queue에서 익은 토마토 위치 정보를 꺼내서 6가지 방향을 모두 확인한다.
vector사이즈에 벗어나지 않고 토마토가 아직 익지 않은 경우만 확인한다.
위의 조건을 모두 만족한다면
now 토마토 값에서 1을 더하여 1일이 지난 것을 표현한다.
box[next[0]][next[1]][next[2]] = box[now[0]][now[1]][now[2]] + 1;
CHECK ANSWER
하나라도 익지 않은 토마토가 있다면 -1을 출력한다
그렇지 않으면 box의 최대값-1이 정답 (맨 처음에 익은 토마토 1값에서 하나씩 더해간 것이라)
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
queue<vector<int>>q;
int M, N, H;
const vector<vector<int>> dir = { {1,0,0}, {-1,0,0}, {0,1,0}, {0,-1,0}, {0,0,-1}, {0,0,1} };
int main()
{
//INPUT
cin >> M >> N >> H;
vector<vector<vector<int>>>box(H, vector<vector<int>>(N, vector<int>(M, -1)));
for (int i = 0; i < H; i++)
{
for (int k = 0; k < N; k++)
{
for (int j = 0; j < M; j++)
{
int n;
cin >> n;
box[i][k][j] = n;
if (n == 1) {q.push({ i,k,j });}
}
}
}
//BFS
while (!q.empty())
{
vector<int> now = q.front();
q.pop();
for (int i = 0; i < dir.size(); i++)
{
vector<int>next = { now[0] + dir[i][0],now[1] + dir[i][1] ,now[2] + dir[i][2] };
if (next[0] < 0 || next[1] < 0 || next[2] < 0 || next[0] >= H || next[1] >= N || next[2] >= M) continue;
if (box[next[0]][next[1]][next[2]] != 0) continue;
box[next[0]][next[1]][next[2]] = box[now[0]][now[1]][now[2]] + 1;
q.push({ next[0] ,next[1] ,next[2] });
}
}
//CHECK ANSWER
int answer = 0;
for (int i = 0; i < H; i++)
{
for (int k = 0; k < N; k++)
{
for (int j = 0; j < M; j++)
{
if (box[i][k][j] == 0) { cout << "-1"; return 0; }
if (box[i][k][j] > answer) { answer = box[i][k][j]; }
}
}
}
cout << answer - 1; return 0;
}