처음엔 모눈종이가 거꾸로 되있고 좌표로 직사각형을 입력받아야해서 조금 생각을 해야했다.
하지만 그 후엔 그냥 단순히 DFS를 구현하면 되는 쉬운 문제였다.
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int m, n, k, cnt;
int map[101][101];
int visit[101][101];
vector<int> ans;
int dx[4] = { 0, 1, 0, -1 };
int dy[4] = { 1,0,-1,0 };
void dfs(int a, int b) {
cnt++;
for (int i = 0; i < 4; i++) {
if (a + dx[i] >= 0 && a + dx[i] < n
&& b + dy[i] >= 0 && b +dy[i] < m
&& visit[a + dx[i]][b + dy[i]] == 0 && map[a + dx[i]][b + dy[i]] == 0) {
visit[a + dx[i]][b + dy[i]] = 1;
dfs(a + dx[i], b + dy[i]);
}
}
return;
}
int main() {
int a, b, c, d;
cin >> m >> n >> k;
for (int i = 0; i < k; i++) {
cin >> a >> b >> c >> d;
for (int j = a; j < c; j++) {
for (int k = b; k < d; k++) {
map[j][k] = 1;
}
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (visit[i][j] == 0 && map[i][j] == 0) {
visit[i][j] = 1;
cnt = 0;
dfs(i, j);
ans.push_back(cnt);
}
}
}
sort(ans.begin(), ans.end());
cout << ans.size() << "\n";
for (int i = 0; i < ans.size(); i++) {
cout << ans[i] << " ";
}
return 0;
}
'알고리즘 공부 > C++' 카테고리의 다른 글
[C++] 백준 13458번: 시험 감독 (0) | 2021.03.17 |
---|---|
[C++] 백준 1992번: 쿼드트리 (0) | 2020.11.30 |
[C++] 백준 2343번: 기타 레슨 (0) | 2020.11.30 |
[C++] 백준 2665번: 미로 만들기 (0) | 2020.11.28 |
[C++] 백준 2206번: 벽 부수고 이동하기 (0) | 2020.11.28 |