티스토리 뷰

백준

백준 소스코드 [C++] 1926 그림

Hani_Levenshtein 2020. 8. 17. 13:02

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

 

1926번: 그림

어떤 큰 도화지에 그림이 그려져 있을 때, 그 그림의 개수와, 그 그림 중 넓이가 가장 넓은 것의 넓이를 출력하여라. 단, 그림이라는 것은 1로 연결된 것을 한 그림이라고 정의하자. 가로나 세로��

www.acmicpc.net

백준 소스코드 [C++] 1926 그림

#include <iostream>
#include <utility>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
int arr[502][502];
bool check[502][502];
int res = 0, countvalue =0;
pair<int, int> p[4] = { {1,0},{-1,0},{0,1},{0,-1} };
queue <pair<int, int>> q;
void bfs() {
	int maxvalue = 0;
	while (q.empty() != true) {
		pair<int, int> pp = q.front();
		q.pop();
		maxvalue++;
		for(int a=0;a<4;a++)
			if (arr[pp.first + p[a].first][pp.second + p[a].second] == 1 &&
				check[pp.first + p[a].first][pp.second + p[a].second] == false)
			{
				check[pp.first + p[a].first][pp.second + p[a].second] = true;
				q.push({ pp.first + p[a].first, pp.second + p[a].second });
				
			}
	}
	
	res = max(res, maxvalue);
}
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	int n, m;
	cin >> n >> m;
	for (int i = 1;i <= n;i++)for (int j = 1;j <= m;j++) cin >> arr[i][j];
	for (int i = 1;i <= n;i++)for (int j = 1;j <= m;j++) 
		if (arr[i][j] == 1 && check[i][j] == false) {
			check[i][j] = true;
			q.push({ i,j });
			bfs();
			countvalue++;
	}
	cout << countvalue << '\n' << res << '\n';

	return 0;
}
댓글