알고리즘/BFS, DFS

[C++] 백준 7579번 토마토

키베이루 2022. 6. 11. 05:53

 

1) 문제설명

백준 Online Judge 7576번 토마토

https://www.acmicpc.net/problem/7569

 

7569번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,

www.acmicpc.net

 

2) 아이디어

기존 7576번의 토마토에서 층을 더 쌓아올린 문제이다. 풀이는 기존 7576번의 토마토와 같다.

7576번 토마토 참고 : https://kiveiru.tistory.com/32?category=557954 

 

[C++] 백준 7576번 토마토

1) 문제설명 2) 아이디어 1. BFS의 시작점이 여러 곳이다 2. 전개가 막혀있는 부분이 있다. 3. 전개가 막혀서 0(익지 않은 토마토)을 1(익은 토마토)로 바꾸지 못할 경우 -1을 출력한다. 정도만 해결한

kiveiru.tistory.com

주의해야될점은 큐에 x,y,z의 세방향을 넣어야 하기때문에  2개의 변수를 묶어주는 make_pair 대신 3개의 변수를 묶어주는 make_tuple을 사용하거나 구조체로 큐를 사용하여야 한다.

이 문제에서는 구조체를 이용하여 x,y,z 세개의 변수를 사용해서 큐에 넣어주는 방식으로 해결하였다.

3) 코드

#include<iostream>
#include<queue>
#include<deque>
#include<string.h>
#include<math.h>
#include<cmath>
#include<stack>
#include<algorithm>

using namespace std;

int arr[101][101][101];
int range[101][101][101];
int m, n, h;
int result;

typedef struct {
	int z, y, x;
}st;

queue <st> q;
void dfs(int z, int y, int x) {



	while (!q.empty()) {

		x = q.front().x;
		y = q.front().y;
		z = q.front().z;

		q.pop();
		int dx[] = { -1,1,0,0,0,0 };
		int dy[] = { 0,0,-1,1,0,0 };
		int dz[] = { 0,0,0,0,-1,1 };

		for (int i = 0; i < 6; i++) {
			int nx, ny, nz;
			nx = x + dx[i]; // 6 
			ny = y + dy[i]; // 4
			nz = z + dz[i];
			if (nx < 1 || ny < 1 || nx > m || ny > n || nz > h || nz < 1 ||arr[nz][ny][nx] == 1) { // 범위에서 벗어나거나 이미 익은 토마토는 넘어간다.
				continue;
			}
			else { // 썩은 토마토 or 익지않은 토마토일때

				if (arr[nz][ny][nx] == 0) { // 익지않은 토마토일때
					arr[nz][ny][nx] = 1; // 익었다고 표시
					q.push({nz,ny,nx}); // 큐에 삽입
					range[nz][ny][nx] = range[z][y][x] + 1; // 최소일수 카운트
					result = range[nz][ny][nx];
				}
			}
		}
	}
}

int main() {

	cin >> m >> n >> h; // m : 가로 , n : 세로 , h : 높이
	for (int i = 1; i <= h; i++) {
		for (int j = 1; j <= n; j++) {
			for (int k = 1; k <= m; k++) {
				cin >> arr[i][j][k];
				if (arr[i][j][k] == 1) {
					q.push({i,j,k}); // 큐에 미리 넣어놔
				}
			}
			
		}
	}
	dfs(1, 1, 1);
	
	for (int i = 1; i <= h; i++) { // 처음부터 끝까지 탐색해서
		for (int j = 1; j <= n; j++) {
			for (int k = 1; k <= m; k++) {
				if (arr[i][j][k] == 0) { // 0이 존재한다면
					result = -1; // 결과값을 -1로 한다
				}
			}
			
		}
	}
	cout << result << endl;
}