https://www.acmicpc.net/problem/2583
#include <iostream>
#include <queue>
#include <algorithm>
#include <vector>
using namespace std;
int main(){
int map[100][100] = { 0 };
int m, n, k;
int cnt = 0;
int dx[4] = { 0, 0, 1, -1 };
int dy[4] = { 1, -1, 0, 0 };
vector<int> ret;
bool visited[100][100] = { 0 };
cin >> m >> n >> k;
for (int i = 0; i < k; i++){
int r_x, r_y, l_x, l_y;
cin >> l_x >> l_y >> r_x >> r_y;
l_y = m-1 - l_y;
r_y = m-1 - r_y;
for (int j = l_y; j > r_y; j--){
for (int k = l_x; k < r_x; k++){
map[j][k] = 1;
}
}
}
for (int i = 0; i < m; i++){
for (int j = 0; j < n; j++){
queue<pair<int, int>> q;
int tmp_ret = 0;
if (visited[i][j] || map[i][j]) continue;
cnt += 1;
q.push({ i, j }); visited[i][j] = true;
while (!q.empty()){
tmp_ret += 1;
int x = q.front().second, y = q.front().first;
q.pop();
for (int k = 0; k < 4; k++){
int xx = x + dx[k], yy = y + dy[k];
if (xx >= n || yy >= m || xx < 0 || yy < 0) continue;
if (map[yy][xx] == 1 ||visited[yy][xx]) continue;
q.push({ yy, xx }); visited[yy][xx] = 1;
}
}
ret.push_back(tmp_ret);
}
}
sort(ret.begin(), ret.end());
cout << cnt << endl;
for (int i = 0; i < cnt; i++){
cout << ret[i] << ' ';
}
}
반응형
'프로그래밍 > 문제풀이' 카테고리의 다른 글
[다익스트라] 백준 레이저 통신 (0) | 2022.12.25 |
---|---|
[프로그래머스] 양과 늑대 (0) | 2022.08.20 |
[이분 탐색] 백준 2110 공유기 설치 (0) | 2019.04.08 |
[이분 탐색] 백준 2343 기타 레슨 (0) | 2019.04.08 |
[이분 탐색] 백준 10816 숫자 카드2 (0) | 2019.04.07 |