728x90
 

2583번: 영역 구하기

첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오른쪽 위 꼭짓점의 x, y좌표값이 빈칸을 사이에 두고 차례로 주어진다. 모눈종이의 왼쪽 아래 꼭짓점의 좌표는 (0,0)이고, 오른쪽 위 꼭짓점의 좌표는(N,M)이다. 입력되는 K개의 직사각형들이 모눈종이 전체를 채우는 경우는 없다.

www.acmicpc.net

BFS로 풀었다.

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

int n;
vector<int> countAll;
vector<int> allArea;

int main() {
	int m, n, k;
	cin >> m >> n >> k;
	vector<vector<int>> v(m);
	for (int i = 0; i < m; i++) 
		v[i] = vector<int>(n);
	for (int i = 0; i < k; i++) {
		int x1, y1, x2, y2;
		cin >> x1 >> y1 >> x2 >> y2;
		for (int x = x1; x < x2; x++) {
			for (int y = y1; y < y2; y++) {
				v[y][x] = 1;
			}
		}
	}
	vector<vector<bool>> visited(m);
	for (int i = 0; i < m; i++)
		visited[i] = vector<bool>(n);
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			if (v[i][j] == 0 && !visited[i][j]) {
				queue < pair<int, int>> q;
				q.push(make_pair(i, j));
				int area = 0;
				while (!q.empty()) {
					pair<int, int> cur = q.front();
					q.pop();
					if (!visited[cur.first][cur.second] && v[cur.first][cur.second] == 0) {
						visited[cur.first][cur.second] = true;
						area++;
						if (cur.first + 1 < m && !visited[cur.first + 1][cur.second] && v[cur.first + 1][cur.second] == 0) {
							q.push(make_pair(cur.first + 1, cur.second));
						}
						if (cur.first - 1 >= 0 && !visited[cur.first - 1][cur.second] && v[cur.first - 1][cur.second] == 0) {
							q.push(make_pair(cur.first - 1, cur.second));
						}
						if (cur.second + 1 < n && !visited[cur.first][cur.second + 1] && v[cur.first][cur.second + 1] == 0) {
							q.push(make_pair(cur.first, cur.second + 1));
						}
						if (cur.second - 1 >= 0 && !visited[cur.first][cur.second - 1] && v[cur.first][cur.second - 1] == 0) {
							q.push(make_pair(cur.first, cur.second - 1));
						}
					}
				}
				allArea.push_back(area);
			}
		}
	}
	cout << allArea.size() << endl;
	sort(allArea.begin(), allArea.end());
	for (int i = 0; i < allArea.size(); i++) {
		cout << allArea[i] << " ";
	}
	return 0;
}
728x90

+ Recent posts