BOJ 길라잡이

[C/C++ 백준 2583번] 영역 구하기 (Silver 1)

새파란 공대생 2020. 10. 13. 20:52

www.acmicpc.net/problem/2583

 

2583번: 영역 구하기

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

www.acmicpc.net

영역을 세는 문제에서, 영역의 넓이도 구하는 문제가 추가되었다. 그냥 각 함수에서 넓이에 관한 변수를 만들어 준뒤, vector에 넣어주었다가 나중에 한번에 정렬해주고 출력하자.

 

#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
int M, N, K, graph[100][100], ans=0;
int xmove[4]={-1,0,1,0};
int ymove[4]={0,1,0,-1};
vector <int> A;
void Search(int x, int y){
	if(graph[x][y]==1)
		return ;
	else{
		int F = 0;
		ans++;
		graph[x][y]=1;
		queue <pair<int, int>> q;
		q.push({x, y});
		while(!q.empty()){
			int tmpx = q.front().first;
			int tmpy = q.front().second;
			q.pop();
			F++;
			for(int i=0; i<4; i++){
				if((xmove[i]+tmpx >=0 && xmove[i]+tmpx<M) &&
				(ymove[i]+tmpy >=0 &&ymove[i]+tmpy<N)){
					if(graph[xmove[i]+tmpx][ymove[i]+tmpy]==0){
						q.push({xmove[i]+tmpx, ymove[i]+tmpy});
						graph[xmove[i]+tmpx][ymove[i]+tmpy] = 1;
					}
				}
			}
		}
		A.push_back(F);
	}	
}
int main(void){
	scanf("%d %d %d",&M ,&N, &K);
	for(int i=0; i<M; i++){
		for(int j=0; j<N; j++){
			graph[i][j]=0;
		}
	}
	int x1, y1, x2, y2;
	for(int i=0; i<K; i++){
		scanf("%d %d %d %d", &y1, &x1, &y2, &x2);
		for(int k=x1; k<x2; k++){
			for(int w=y1; w<y2; w++){
				graph[k][w] = 1;
			}
		}
	}
	for(int i=0; i<M; i++){
		for(int j=0; j<N; j++){
			Search(i, j);
		}
	}
	printf("%d\n", ans);
	sort(A.begin(), A.end());
	for(int i=0; i<A.size(); i++)
		printf("%d ", A[i]);
}