[백준 7569] 토마토 (3D 버전) (수정 진행 중)
2023. 3. 27. 18:40ㆍ자료구조 및 알고리즘/백준
728x90
백준 7569번 토마토 3차원 3D 버전
#include <iostream>
#include <queue>
#include <tuple>
using namespace std;
// 7569 토마토
int n, m, h; // 행, 열, 높이,
int target; // 익혀야할 개수
int box[102][102][102];
int vis[102][102][102];
int dx[] = {0, 0, 0, 0, -1, 1}; // 높이
int dy[] = {0, 1, 0, -1, 0, 0}; // 행
int dz[] = {-1, 0, 1, 0, 0, 0}; // 열
queue<tuple<int, int, int>> qu; // {h좌표, x좌표, y좌표}
void initarr(){
for(int i = 0; i < 102; i++) { // 높이
for (int j = 0; j < 102; j++) { // 행
fill(vis[i][j], vis[i][j]+102, -1);
}
}
}
bool checkrange(int i, int j, int k){ // 높이, 행, 열 -> 유효범위 체크
return (i > 0 && i <= h && j > 0 && j <= n && k > 0 && k <= m);
}
int bfs(){
int day = 0;
while(!qu.empty()){
int curx = get<0>(qu.front()); // 높이
int cury = get<1>(qu.front()); // 행
int curz = get<2>(qu.front()); // 열
qu.pop();
for(int i = 0; i < 6; i++){ // 6방향 체크한다
int nx = curx + dx[i];
int ny = cury + dy[i];
int nz = curz + dz[i];
// 유효범위, 안익은 토마토(방문배열-1)인지, 토마토가 있는지 여부.
if(!checkrange(nx, ny, nz) || vis[nx][ny][nz] != -1 || box[nx][ny][nz] == -1) continue;
vis[nx][ny][nz] = vis[curx][cury][curz] + 1; // 현재날짜 +1
day = max(day, vis[nx][ny][nz]);
qu.push(make_tuple(nx,ny,nz));
target--; // 익혔다
}
}
return day;
}
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> m >> n >> h; // 열,행,높이 순서
initarr(); // 방문배열에는 익은 날짜를 저장할 것이므로 전부 -1로 초기화
for(int i = 1; i <= h; i++){ // 높이
for(int j = 1; j <= n; j++){ // 행
for(int k = 1; k <= m; k++){ // 열
cin >> box[i][j][k];
if(box[i][j][k] == 0) {
target++; // 익혀야 할 토마토(0) 개수 세기
vis[i][j][k] = -1; // 방문 타겟
}
if(box[i][j][k] == 1) { // 이미 익은 토마토(1) 는 시작점이 된다.
vis[i][j][k] = 1;
qu.push(make_tuple(i, j, k));
}
}
}
}
if(target == 0) cout << 0; // 익혀야할 것이 없다
else{
int day = bfs();
if(target == 0) cout << day-1;
else cout << -1;
}
return 0;
}
tuple이라는 자료형을 이용했다.
이에 대해서는 포스팅 해보자...
참고한 코드 출처) https://www.acmicpc.net/source/share/ed4548df698a447a881cba31bcedef73
728x90
'자료구조 및 알고리즘 > 백준' 카테고리의 다른 글
[백준 24480] 알고리즘 수업 - 깊이 우선 탐색 2 (0) | 2023.03.28 |
---|---|
[백준 24479] 알고리즘 수업 - 깊이 우선 탐색 1 (0) | 2023.03.28 |
[백준 6588] 골드바흐의 추측 (0) | 2023.03.19 |
[백준 1021번] 회전하는 큐 (0) | 2023.03.05 |
[백준 1966] 프린터 큐 (0) | 2023.02.27 |