[BOJ] 2583. 영역 구하기

동스토리 ㅣ 2020. 10. 6. 03:28

반응형

문제

www.acmicpc.net/problem/2583

 

2583번: 영역 구하기

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

www.acmicpc.net


해설

 

(x1, y1) ~ (x2, y2) 까지 배열의 값을 1로 변경 후 (0, 0)부터 dfs탐색을 통해 나온 결과 값을 벡터에 값을 넣어준다.


코드

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int map[101][101];
int cnt;
int m, n, k;
const int dx[] = { 0,1,0,-1 };
const int dy[] = { 1,0,-1,0 };

void dfs(int x, int y) {

	if (map[x][y] == 0) {
		map[x][y] = 1;
		cnt++;
		for (int i = 0; i < 4; i++) {
			int nx = x + dx[i];
			int ny = y + dy[i];
			if (nx >= 0 && ny >= 0 && nx < m && ny < n) {
				dfs(nx, ny);
			}
		}
	}
}

int main() {

	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	vector<int>q;
	int x1, y1, x2, y2;
	cin >> m >> n >> k;

	for (int i = 0; i < k; i++) {
		cin >> x1 >> y1 >> x2 >> y2;

		for (int i = x1; i < x2; i++) {
			for (int j = y1; j < y2; j++) {
				map[j][i] = 1;
			}
		}
	}

	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			if (map[i][j] == 0) {
				cnt = 0;
				dfs(i, j);
				q.push_back(cnt);
			}
		}
	}
	sort(q.begin(), q.end());

	cout << q.size() << '\n';

	for (int i = 0; i < q.size(); i++) cout << q[i] << " ";
	return 0;

}

 

 

 

반응형

'Development > Algorithm' 카테고리의 다른 글

[BOJ] 1920. 수 찾기  (0) 2020.10.17
[BOJ] 3085. 사탕 게임  (0) 2020.10.06
[BOJ] 11729. 하노이 탑 이동 순서  (0) 2020.10.04
[BOJ] 2606. 바이러스  (0) 2020.10.04
[BOJ] 10809. 알파벳 찾기  (0) 2020.10.03