[Baekjoon/C++] 7569번 토마토
문제 설명

입출력 예

코드 구현
#include <iostream>
#include <vector>
#include <queue>
#include <tuple>
using namespace std;
int M, N, H; //열, 행, 높이
vector<vector<vector<int>>> box;
queue<tuple<int, int, int>> rtomato;
int dx[6]={1, -1, 0, 0, 0, 0}; //x축 이동
int dy[6]={0, 0, 1, -1, 0, 0}; //y축 이동
int dz[6]={0, 0, 0, 0, 1, -1}; //z축 이동
int BFS(){
int x=0, y=0, z=0; //마지막 토마토 좌표 저장
while(!rtomato.empty()){
x=get<0>(rtomato.front());
y=get<1>(rtomato.front());
z=get<2>(rtomato.front());
rtomato.pop();
for(int i=0; i<6; i++){
int nx=x+dx[i];
int ny=y+dy[i];
int nz=z+dz[i];
if(nx>=0 && nx<N && ny>=0 && ny<M && nz>=0 && nz<H){
if(box[nz][nx][ny]==0){
rtomato.emplace(nx, ny, nz);
box[nz][nx][ny]=box[z][x][y]+1;
}
}
}
}
for(int i=0; i<H; i++){
for(int j=0; j<N; j++){
for(int k=0; k<M; k++){
if(box[i][j][k]==0){ //익지 않은 토마토가 남아있으면
return -1;
}
}
}
}
return box[z][x][y]-1; //시작날 제외
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> M >> N >> H;
box.resize(H, vector<vector<int>>(N, vector<int>(M)));
for(int i=0; i<H; i++){
for(int j=0; j<N; j++){
for(int k=0; k<M; k++){
cin >> box[i][j][k];
if(box[i][j][k]==1){
rtomato.emplace(j, k, i); //익은 토마토 초기 좌표
}
}
}
}
cout << BFS();
return 0;
}
[Baekjoon/C++] 7576번 토마토와 같은 문제이지만 이번 문제는 3차원 배열이라는점이 달랐다. 3차원 배열 문제는 처음 풀어봤는데, 2차원과는 다르게 좌우, 상하, 위아래 총 6방향을 고려해야했고 xyz축의 위치를 설정해주어야 하는 부분이 헷갈려서 연습이 더 필요한것 같다.
출처: 백준, https://www.acmicpc.net/problem/7569