[백준] 토마토

hamsteak·2024년 1월 29일
0

ps

목록 보기
39/39

창고에 보관된 토마토가 모두 익는데 걸리는 최소 일수를 구하는 문제.

  1. 익은 토마토의 위치를 현재큐에 모두 넣는다.
  2. 현재큐를 순회하며 인접하면서 익지 않은 토마토의 위치를 다음 큐에 넣어준다.
  3. 만약 다음 큐가 비었다면 더 이상 익을 토마토가 없다는 뜻이므로 5번으로 이동.
  4. 현재큐에 다음큐를 넣고 다음큐는 초기화한 후 2번으로 이동.
  5. 모든 위치를 순회하며 아직 익지 않은 토마토의 개수 검사
    5-1. 검사 결과 1개 이상인 경우 -1 출력
    5-2. 검사 결과 0개인 경우 다음큐에서 현재큐로 옮긴 횟수 출력

https://www.acmicpc.net/source/72430248

cpp code

#include <iostream>
#include <queue>
#include <tuple>

using namespace std;


using lld = long long int;
using ulld = unsigned long long int;
using pii = pair<int, int>;
using tiii = tuple<int, int, int>;

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

int M, N, H;
int A[100][100][100];
int ans;

int main(void) {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> M >> N >> H;
	for (int i = 0; i < H; i++) {
		for (int j = 0; j < N; j++) {
			for (int k = 0; k < M; k++) {
				cin >> A[i][j][k];
			}
		}
	}

	queue<tiii> next_Q;
	for (int i = 0; i < H; i++) {
		for (int j = 0; j < N; j++) {
			for (int k = 0; k < M; k++) {
				if (A[i][j][k] == 1) {
					next_Q.emplace(i, j, k);
				}
			}
		}
	}
	while (true) {
		queue<tiii> Q(next_Q);
		next_Q = queue<tiii>();
		while (!Q.empty()) {
			int cur_z = get<0>(Q.front());
			int cur_y = get<1>(Q.front());
			int cur_x = get<2>(Q.front());
			Q.pop();

			for (int i = 0; i < 6; i++) {
				int nz = cur_z + dz[i];
				int ny = cur_y + dy[i];
				int nx = cur_x + dx[i];
				if (nz < 0 || nz > H - 1 || ny < 0 || ny > N - 1 || nx < 0 || nx > M - 1) continue;
				if (A[nz][ny][nx] != 0) continue;
				A[nz][ny][nx] = 1;
				next_Q.emplace(nz, ny, nx);
			}
		}

		if (next_Q.empty()) break;

		ans++;
	}
	for (int i = 0; i < H; i++) {
		for (int j = 0; j < N; j++) {
			for (int k = 0; k < M; k++) {
				if (A[i][j][k] == 0) {
					cout << "-1\n";
					return 0;
				}
			}
		}
	}

	cout << ans << endl;

	return 0;
}
profile
안녕하세요

0개의 댓글