티스토리 뷰

백준

백준 소스코드 [C++] 7576 토마토

Hani_Levenshtein 2020. 8. 17. 07:37

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

 

7576번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토�

www.acmicpc.net

백준 소스코드 [C++] 7576 토마토

#include <iostream>
#include <utility>
#include <vector>
#include <algorithm>
#include <queue>
#include <string.h>
using namespace std;
int arr[1002][1002];
pair<int, int>direction[4] = { {-1,0},{1,0},{0,1} ,{0,-1} };
queue<pair<int, int> > q;
int num = 0;
int day = -1;
pair<int, int> v[1000001];
void bfs() {
	while (q.empty() != true) {
		int b = 0;
		while (q.empty() != true) {
			v[b] = q.front();
			q.pop();
			b++;
		}
		day++;
		for (int i = 0;i < b;i++) {
			for (int a = 0;a < 4;a++)
				if (arr[v[i].first + direction[a].first][v[i].second + direction[a].second] == 0)
				{
					q.push({ v[i].first + direction[a].first, v[i].second + direction[a].second });
					arr[v[i].first + direction[a].first][v[i].second + direction[a].second] = 1;
					num++;
				}
		}
	}
	return;
}
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	int n, m;
	int a = 0;
	cin >> m >> n;
	for (int i = 0;i < 1002;i++)for (int j = 0;j < 1002;j++)arr[i][j] = -1;

	for (int j = 1;j <= n;j++)
		for (int i = 1;i <= m;i++) {
			cin >> arr[j][i];
			if (arr[j][i] == 1) {
				q.push({ j,i });
				num++;
			}
			else if (arr[j][i] == -1)a++;
		}
	bfs();
	if (num == n * m - a) cout << day;
	else cout << "-1";
	return 0;
}
댓글