Deff_Dev
[백준] 2583번 영역 구하기 (C++) 본문
문제
https://www.acmicpc.net/problem/2583=
풀이
N * M 크기의 맵에 입력된 직사각형 영역을 1로 채운 다음 BFS를 이용하여 비어 있는 영역의 갯수와 크기를 구했다
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
// https://www.acmicpc.net/problem/2583
using namespace std;
int M, N, K;
int map[101][101] = { 0, };
bool visited[101][101] = { false, };
int dx[4] = { 1,-1,0,0 };
int dy[4] = { 0,0,1,-1 };
vector<int> answer;
void BFS(pair<int,int> startPos) {
queue<pair<int, int>> q;
q.push(startPos);
visited[startPos.first][startPos.second] = true;
int count = 1;
while (!q.empty()) {
int x = q.front().second;
int y = q.front().first;
q.pop();
for (int i = 0; i < 4; i++) {
int moveX = x + dx[i];
int moveY = y + dy[i];
if (moveX < 0 || moveY < 0 || moveX >= N || moveY >= M)
continue;
if (!visited[moveY][moveX] && map[moveY][moveX] == 0) {
visited[moveY][moveX] = true;
q.push({ moveY, moveX });
count++;
}
}
}
answer.push_back(count);
}
int main() {
cin >> M >> N >> K;
int bx, by, ux, uy;
for (int i = 0; i < K; i++) {
cin >> bx >> by >> ux >> uy;
for (int j = by; j < uy; j++) {
for (int k = bx; k < ux; k++) {
map[j][k] = 1;
}
}
}
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
if (!visited[i][j] && map[i][j] == 0) {
BFS({ i,j });
}
}
}
sort(answer.begin(), answer.end());
cout << answer.size() << endl;
for (int i = 0; i < answer.size(); i++) {
cout << answer[i] << " ";
}
return 0;
}
'코딩테스트 > 백준' 카테고리의 다른 글
[백준] 2156번 포도주 시식 (C++) (0) | 2024.09.10 |
---|---|
[백준] 1026번 보물 (C++) (0) | 2024.09.06 |
[백준] 좋다 (C++) (0) | 2024.09.05 |
[백준] 나무꾼 이다솜 (C++) (1) | 2024.09.05 |
[백준] 1461번 도서관 (C++) (2) | 2024.09.02 |