반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

코딩하기 좋은날

백준 2583 영역 구하기 본문

백준(Baekjoon) 문제

백준 2583 영역 구하기

huiung 2019. 2. 9. 23:22
반응형

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

문제와 채점은 위 사이트에서 확인 하실 수 있습니다

 

주어진 직사각형 부분을 제외한 영역의 개수와 그영역들의 넓이를 구하는 문제입니다.

 

저는 이문제를 dfs를 통해서 해결 하였고 문제가 좌표가 수학에서의 평면좌표 형식으로 주어져서 배열에서는 돌려서(?) 생각을 하시면 될거 같습니다.

 

나머지는 크게 어려운 부분이 없습니다. main함수에서 dfs가 호출된 횟수가 영역의 개수이고 dfs안에서 마지막 지점에 도착할때까지 진행된 횟수가 그영역의 넓이입니다.

 

다음은 코드입니다.

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int arr[101][101];
int nextx[4] = {1, 0, -1, 0};
int nexty[4] = {0, 1, 0, -1};
vector<int> v;
int M,N,K;


int dfs(int a, int b, int num) {
	
	arr[a][b] = 1;

	for(int i = 0; i < 4; i++) {
		int x = a + nextx[i];
		int y = b + nexty[i];
		
		if(x < 0 || x >= N || y < 0 || y >= M)
			continue;
		
		if(!arr[x][y])
			num = dfs(x, y, num+1);
	}
	return num;
}

int main(void) {
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	cin >> M >> N >> K;
	int lx,ly;
	int rx,ry;
	int areanum = 0;
	
	for(int i = 0; i < K; i++) {
		cin >> lx >> ly >> rx >> ry;
		for(int j = 0; j < ry - ly; j++) 
			for(int k = 0; k < rx - lx; k++)
				arr[lx+k][ly+j] = 1;
	}
	
	for(int i = 0; i < N; i++)
		for(int j = 0; j < M; j++)
			if(!arr[i][j]) {
				v.push_back(dfs(i, j, 1));
				areanum++;
			}
	
	sort(v.begin(), v.end());
	cout<<areanum<<'\n';
	for(auto n: v)
		cout<<n<<' ';
	return 0;
}

 

 

반응형

'백준(Baekjoon) 문제' 카테고리의 다른 글

백준 5014 스타트링크  (0) 2019.02.10
백준 1012 유기농 배추  (0) 2019.02.10
백준 1525 퍼즐  (0) 2019.02.09
백준 1987 알파벳  (0) 2019.02.08
백준 9663 N-Queen  (0) 2019.02.08