티스토리 뷰

백준

백준 소스코드 [C++] 2583 영역 구하기

Hani_Levenshtein 2020. 8. 17. 13:22

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

 

2583번: 영역 구하기

첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오

www.acmicpc.net

백준 소스코드 [C++] 2583 영역 구하기

#include <iostream>
#include <utility>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
int arr[502][502];
bool check[502][502];
pair<int, int> p[4] = { {1,0},{-1,0},{0,1},{0,-1} };
queue <pair<int, int>> q;
int 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] == 2 &&
				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 });
				
			}
	}
	return maxvalue;
}
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	int n, m,k;
	cin >> n >> m>>k;
	int left,right,up,down;
	vector<int>v;
	for (int i = 1;i <= n;i++)for (int j = 1;j <= m;j++) arr[i][j] = 2;
	for (int i = 0;i < k;i++) {
		cin >> left >> down >> right >> up;
		for (int i = left + 1;i <= right;i++)for (int j = down + 1;j <= up;j++) arr[j][i] = 1;
	}

	for (int i = 1;i <= n;i++)for (int j = 1;j <= m;j++) 
		if (arr[i][j] == 2 && check[i][j] == false) {
			check[i][j] = true;
			q.push({ i,j });
			v.push_back(bfs());
	}
	sort(v.begin(), v.end());
	cout << v.size() << '\n';
	for (int i = 0;i < v.size();i++) cout << v[i] << " ";
	return 0;
}
댓글