[BOJ]7569번 토마토

yeham·2022년 12월 10일
0

백준

목록 보기
18/22

문제

토마토

코드

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


using namespace std;

int board[101][101][101];
int visit[101][101][101];

bool board_check = false;

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

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);

	queue<tuple<int, int, int>> q;

	int n, m, o;

	cin >> n >> m >> o;

	for (int i = 0; i < o; i++)
	{
		for (int j = 0; j < m; j++)
		{
			for (int k = 0; k < n; k++)
			{
				cin >> board[i][j][k];
				if (board[i][j][k] == 1)
				{
					visit[i][j][k] = 1;
					q.push({i, j, k});
				}
				else if (board[i][j][k] == -1)
					visit[i][j][k] = -1;
				else if (board[i][j][k] == 0)
					board_check = true;
			}
		}
	}

	if (board_check == false)
	{
		cout << 0;
		return (0);
	}

	int day = 0;

	while(!q.empty())
	{
		tuple<int, int, int> cur = q.front();
		q.pop();

		for (int i = 0; i < 6; i++)
		{
			int tz = get<0>(cur) + dz[i];
			int ty = get<1>(cur) + dy[i];
			int tx = get<2>(cur) + dx[i];
			if (tx < 0 || tx >= n || ty < 0 || ty >= m || tz < 0 || tz >= o)
				continue;
			if (board[tz][ty][tx] == -1 || visit[tz][ty][tx] != 0)
				continue;
			q.push({tz, ty, tx});
			visit[tz][ty][tx] = visit[get<0>(cur)][get<1>(cur)][get<2>(cur)] + 1;
		}
	}

	for (int i = 0; i < o; i++)
	{
		for (int j = 0; j < m; j++)
		{
			for (int k = 0; k < n; k++)
			{
				if (visit[i][j][k] == 0)
				{
					cout << -1;
					return (0);
				}
				if (visit[i][j][k] > day)
					day = visit[i][j][k];
			}
		}
	}
	cout << day - 1;
}
profile
정통과 / 정처기 & 정통기 / 42seoul 7기 Cardet / 임베디드 SW 개발자

0개의 댓글