본문 바로가기
알고리즘/백준

[7569] 토마토 c++

by 오오오니 2023. 5. 12.

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

 

7569번: 토마토

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

www.acmicpc.net

 

풀이

bfs로 풀었다.
3차원 배열에 토마토를 저장해두고 큐가 비기 전까지 bfs를 수행한다.

x,y,z 좌표는 pair에 저장해주었다.


3차원 좌표하고 자료구조하고 매칭시키는것이 조금 헷갈렸다.

#include<iostream>
#include<queue>
using namespace std;

int box[100][100][100];
int M, N, H;//가로 , 세로, 높이
int ans;
int chk;
queue<pair<pair<int, int>, int>> q;

void bfs()
{
	int dx[] = { 0,1,-1,0 ,0,0 };
	int dy[] = { -1,0,0,1,0,0 };
	int dh[] = { 0,0,0,0,1,-1 };
	while (!q.empty())
	{
		int size = q.size();
		ans++;
		for (int i = 0; i < size; i++)
		{
			
			
			for (int t = 0; t < 6; t++)
			{
				int x = q.front().first.second + dx[t];
				int y = q.front().first.first + dy[t];
				int h = q.front().second + dh[t];

				if (x >= 0 && x < M && y >= 0 && y < N && h >= 0 && h < H)
					if (!box[h][y][x])
					{

						box[h][y][x] = 1;
						q.push({ { y,x }, h });

					}

			}
			q.pop();
		}
	}
//익지않은 토마토가 있는지 확인
	for (int i = 0; i < H; i++)
		for (int j = 0; j < N; j++)
			for (int k = 0; k < M; k++)
			{
				if (!box[i][j][k])
				{
					cout << "-1";
					return;
				}
			}
	cout << ans - 1;
}
	

int main()
{
	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++)//1은 익은 토마토, 0 은 익지 않은 토마토, 정수 -1은 토마토가 들어있지 않음
			{
				cin >> box[i][j][k];
				if (!box[i][j][k])
					chk++;
				if (box[i][j][k] == 1)
					q.push({ {j,k} ,i });
			}
	if (!chk) {
		cout << 0;//다 익어 있음
		return 0;
	}

	bfs();

	return 0;
}

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 2179 비슷한 단어 c++  (0) 2024.07.18
[백준] 1987 알파벳 c++  (0) 2023.04.16
[백준] 2137 c++  (0) 2023.04.01
[백준] 11404 플로이드 C++  (0) 2023.03.24
[백준] 1715 카드 정렬하기 c++  (1) 2023.01.28