[백준/C++] 토맛토마토_7569

leeact·2023년 5월 19일
1

[백준/c++]

목록 보기
10/24
post-thumbnail

📝 문제

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

💻 코드

#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>

struct Dir {
	int x;
	int y;
	int z;
};

using namespace std;
int arr[101][101][101] = { 0, };
int check[101][101][101] = { 0, };
int row, col, height;
Dir dir[6] = { {1, 0, 0}, {0, 1, 0}, {0, -1, 0}, {-1, 0, 0}, {0, 0, 1}, {0, 0, -1} };
queue<Dir> q;

int main() {

	cin >> col >> row >> height;
	int cnt = 0;
	int MAX = 0;
	for (int h = 0; h < height; h++) {
		for (int j = 0; j < row; j++) {
			for (int k = 0; k < col; k++) {
				int temp;
				cin >> temp;
				if (temp == 1) q.push({ j, k, h });
				else if (temp == 0) cnt += 1;
				arr[h][j][k] = temp;
			}
		}
	}

	if (cnt == 0) { // 이미 토마토가 다 익음.
		cout << 0;
	}
	else {
		// bfs
		while (!q.empty()) {
			Dir now = q.front();
			q.pop();

			check[now.z][now.x][now.y] = 1;

			for (int i = 0; i < 6; i++) {

				// 다음으로 가는 좌표
				int nextX = now.x + dir[i].x;
				int nextY = now.y + dir[i].y;
				int nextZ = now.z + dir[i].z;

				// 이 좌표들이 익을 수 있는가?
				// 범위를 벗어나거나 이미 방문한 적 있는 노드
				if (nextX < 0 || nextY < 0 || nextZ < 0 || nextX >= row || nextY >= col || nextZ >= height || check[nextZ][nextX][nextY]) continue;
				if (arr[nextZ][nextX][nextY] == -1) continue;
				if (arr[nextZ][nextX][nextY] == 1) continue;
				arr[nextZ][nextX][nextY] = arr[now.z][now.x][now.y] + 1;
				
				check[nextZ][nextX][nextY] = 1;
				q.push({ nextX, nextY, nextZ });

			}
		}
		bool flag = true;
		for (int h = 0; h < height; h++) {
			for (int j = 0; j < row; j++) {
				for (int k = 0; k < col; k++) {
					if (arr[h][j][k] == 0) flag = false;
					if (arr[h][j][k] > MAX) MAX = arr[h][j][k];
				}
			}
		}

		if (flag) {
			cout << MAX - 1;
		}
		else {
			cout << -1;
		}
	}
	


	

	return 0;
}

💡 Point

2차원 토마토를 넘어 3차원 토마토를 풀어보았다.
C++은 3차원이 있어서 간단하게 구현했다. 코드를 짜면서 주의할 점은 up,down으로 가는 것만 신경쓰면 될 것 같다.
*예외처리를 1개 놓쳐서 개고생함...

2개의 댓글

comment-user-thumbnail
2023년 5월 19일

탈출은 왜 안푸시고 토마토 푸셨나요?!

1개의 답글