🖥️ CS/Baekjoon Algorithms

#2583번 영역구하기 (C++)

한국의 메타몽 2020. 10. 20. 15:41

링크 : www.acmicpc.net/problem/2583

 

2583번: 영역 구하기

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

www.acmicpc.net

그다지 어렵지 않지만, 좌표를 받는 부분에서 반복적으로 실수를 냈다.

 

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

using namespace std;

int m = 0, n = 0, k = 0, my = 0, mx = 0 ,width = 0;
bool ch[102][102] = { false, };
int yy[4] = { 0,1,0,-1 };
int xx[4] = { 1,0,-1,0 };

void dfs(int y, int x) {
	ch[y][x] = true;
	width++;
	for (int i = 0; i < 4; i++) {
		my = y + yy[i];
		mx = x + xx[i];
		if (my >= 0 && my < m && mx >= 0 && mx < n) {
			if (!ch[my][mx]) dfs(my, mx);
		}
	}
}

int main(void) {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	int y1 = 0, x1 = 0, y2 = 0, x2 = 0;
	vector<int> v;
	cin >> m >> n >> k;
	for (int i = 0; i < k; i++) {
		cin >> x1 >> y1 >> x2 >> y2;
		for (int a = y1; a < y2; a++) {
			for (int b = x1; b < x2; b++) {
				ch[a][b] = 1;
			}
		}
	}
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			if (!ch[i][j]) {
				width = 0;
				dfs(i, j);
				v.push_back(width);
			}
		}
	}
	sort(v.begin(), v.end());
	cout << v.size() << "\n";
	for (int i = 0; i < v.size(); i++) cout << v[i] << ' ';
	return 0;
}

'🖥️ CS > Baekjoon Algorithms' 카테고리의 다른 글

#1931번 회의실배정 (C++)  (0) 2020.10.30
#11047번 동전 0 (C++)  (0) 2020.10.28
#1912번 연속합 (C++)  (0) 2020.10.20
#11053번 가장 긴 증가하는 부분 수열 (C++)  (0) 2020.10.20
#2156번 포도주 시식 (C++)  (0) 2020.10.16