[백준 / C++] 7569번: 토마토 (BFS, 3차원 배열)

728x90
728x90

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

 

7569번: 토마토

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

www.acmicpc.net

난이도: solved.ac 골드 5

 

 

box라는 3차원 배열을 만들고, 해당 배열에 입력을 받았다.

그리고 먼저 box[i][j][k] = 1인 곳을 큐에 담고, 큐에서 하나씩 꺼내 주위 위, 아래, 오른쪽, 왼쪽, 앞, 뒤 중 0인 곳은 값을 1씩 증가시켜 저장하였다.

0일차를 1로 시작했으므로 box[i][j][k]가 가장 큰 곳에서 1을 뺀 값을 출력하도록 해주었다.

그리고 -1로 둘러 쌓여 익지 못한 곳 (0)인 곳이 있으면 -1을 출력하도록 해주었다.

 

#include <bits/stdc++.h>
using namespace std;

int box[100][100][100];
typedef pair<int, pair<int, int>> cor;
queue<cor> q;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int N, M, H, i, j, k;
	cin >> M >> N >> H;
	for (i = 0; i < H; i++)
		for (j = 0; j < N; j++)
			for (k = 0; k < M; k++) {
				cin >> box[i][j][k];
				if (box[i][j][k] == 1)
					q.push(make_pair(i, make_pair(j, k)));
			}

	int dx[6] = { 1,0,-1,0,0,0 };
	int dy[6] = { 0,1,0,-1,0,0 };
	int dz[6] = { 0,0,0,0,1,-1 };

	while (!q.empty()) {
		cor qfront = q.front();
		q.pop();
		int curz = qfront.first;
		int cury = qfront.second.first;
		int curx = qfront.second.second;
		int order = box[curz][cury][curx];
		for (int dir = 0; dir < 6; dir++) {
			int nz = curz + dz[dir];
			int ny = cury + dy[dir];
			int nx = curx + dx[dir];
			if (nz >= 0 && nz < H && ny >= 0 && ny < N && nx >= 0 && nx < M) {
				if (!box[nz][ny][nx]) {
					q.push(make_pair(nz, make_pair(ny, nx)));
					box[nz][ny][nx] = order + 1;
				}
			}
		}
	}
	int max = 0;
	for (i = 0; i < H; i++)
		for (j = 0; j < N; j++)
			for (k = 0; k < M; k++) {
				if (box[i][j][k]) {
					if (box[i][j][k] > max)
						max = box[i][j][k];
				}
				else {
					cout << "-1";
					return 0;
				}
			}
	cout << max - 1;
}

 

코드 제출 결과
코드 제출 결과

반응형