끄적끄적 코딩
article thumbnail
Published 2019. 9. 11. 10:50
[C++] 백준 7569번 토마토 알고리즘

BFS문제입니다.

익은 토마토는 다음날 상, 하, 좌, 우, 위층, 아래층의 토마토를 익게합니다. (익지 않은 토마토 제외)
이 때 토마토가 전부 익는데 걸리는 최소날짜를 구해야합니다.

숫자가 1인 부분을 큐에 넣어놓고 빼면서 주변이 0인곳을 탐색하는 방식으로
BFS를 사용하여서 문제를 풀었습니다.

0인곳을 탐색하면 그 위치를 큐에 넣고 방문을 했다고 처리해줍니다.
큐가 비어있게 되면은 배열에 0이 있는지 확인하고 없으면
카운트한 횟수를 출력하고, 있으면 -1을 출력합니다.

 

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

int map[110][110][110];
int moveX[4] = { 0, 1, 0, -1 };
int moveY[4] = { 1, 0, -1, 0 };
int moveZ[2] = { -1, 1 };
queue<vector<int> >q;

int main(int argc, char* argv[])
{
	int n, m, h;
	int a, b, c;
	int count;
	int x, y, z;
	int flag = 0;

	memset(map, -1, sizeof(map));

	cin >> m >> n >> h;

	for (int k = 1; k <= h; ++k) {
		for (int i = 1; i <= n; ++i) {
			for (int j = 1; j <= m; ++j) {
				cin >> map[k][i][j];
				if (map[k][i][j] == 1) {
					vector<int> element;
					element.push_back(k);
					element.push_back(i);
					element.push_back(j);
					element.push_back(0);
					q.push(element);
				}
			}
		}
	}

	while (!q.empty()) {
		a = q.front()[0];
		b = q.front()[1];
		c = q.front()[2];
		count = q.front()[3];
		q.pop();

		for (int i = 0; i < 4; ++i) {
			x = b + moveX[i];
			y = c + moveY[i];

			if (map[a][x][y] == 0) {
				vector<int> element;
				element.push_back(a);
				element.push_back(x);
				element.push_back(y);
				element.push_back(count + 1);
				q.push(element);
				map[a][x][y] = 1;
			}
		}
		for (int i = 0; i < 2; ++i) {
			z = a + moveZ[i];

			if (map[z][b][c] == 0) {
				vector<int> element;
				element.push_back(z);
				element.push_back(b);
				element.push_back(c);
				element.push_back(count + 1);
				q.push(element);
				map[z][b][c] = 1;
			}
		}
	}
	for (int k = 1; k <= h; ++k) {
		for (int i = 1; i <= n; ++i) {
			for (int j = 1; j <= m; ++j) {
				if (map[k][i][j] == 0) {
					flag = 1;
				}
			}
		}
	}

	if (flag) {
		cout << "-1" << endl;
	}
	else {
		cout << count << endl;
	}

	return 0;
}

'알고리즘' 카테고리의 다른 글

[C++] 백준 15649번 N과 M (1)  (0) 2019.09.11
[C++] 백준 2206번 벽 부수고 이동하기  (0) 2019.09.11
[C++] 백준 7576번 토마토  (0) 2019.09.11
[C++] 백준 2178번 미로 탐색  (0) 2019.09.10
[C++] 백준 2606번 바이러스  (0) 2019.09.10

검색 태그