Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 잔
- HTML #CSS
- 컴퓨터공학 #Java #자바 #클래스 #객체 #인스턴스
- BOJ #컴퓨터공학 #C++ #알고리즘 #자료구조
- 컴퓨터공학 #c #c언어 #문자열입력
- 컴퓨터공학 #자료구조 #스택 #c++ #알고리즘 #백준문제풀이
Archives
- Today
- Total
영벨롭 개발 일지
[백준 BOJ][C++]2583번 영역 구하기 풀이: DFS/BFS 본문
https://www.acmicpc.net/problem/2583
이 문제는 재귀호출을 통한 DFS로 해결할 수 있습니다.
먼저 N*M 크기의 지도의 모든 위치에 해당하는 값을 0으로 set 해줍니다.
K개의 직사각형에 대한 위치 정보가 주어지면 직사각형에 해당하는 위치를 지도에서 1로 set 해줍니다.
이제 아직 방문하지 않은 영역에서 dfs()를 호출합니다. 이때 영역의 넓이도 구해야하므로 dfs()를 호출하기 전 ret을 0으로 set한 뒤 dfs() 내부에서 ret++를 해줍니다.
dfs()는 해당 위치에서 연결된 모든 영역을 탐색하며 ret은 그 영역의 개수를 나타냅니다.
dfs()가 종료되면 분리된 영역의 개수를 나타내는 cnt를 cnt++ 해줍니다.
이때, 분리된 영역의 넓이 ret을 오름차순으로 정렬하여 출력해야하기 때문에 ret을 우선순위큐에 push해줍니다.
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstdlib>
#include<vector>
using namespace std;
int n, m, k;
int map[101][101] = { 0, };
bool visit[101][101] = { false, };
int ret = 0;
int dx[4] = { 1, 0, 0, -1 };
int dy[4] = { 0, 1, -1, 0 };
void dfs(int x, int y) {
visit[y][x] = true;
ret++;
for (int i = 0; i < 4; i++) {
int tx = x + dx[i];
int ty = y + dy[i];
if (tx < 0 || tx >= n || ty < 0 || ty >= m)
continue;
if (visit[ty][tx] || map[ty][tx] == 1)
continue;
dfs(tx, ty);
}
}
int main(void) {
int cnt = 0;
int x1, x2, y1, y2;
priority_queue<int, vector<int>, greater<int>> ans;
cin >> m >> n >> k;
while (k > 0) {
cin >> x1 >> y1 >> x2 >> y2;
for (int i = y1; i < y2; i++) {
for (int j = x1; j < x2; j++) {
if (map[i][j] == 0) {
map[i][j] = 1;
}
}
}
k--;
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (!visit[i][j] && map[i][j] == 0) {
ret = 0;
dfs(j, i);
cnt++;
ans.push(ret);
}
}
}
cout << cnt << endl;
while (!ans.empty()) {
cout << ans.top() << " ";
ans.pop();
}
return 0;
}
반응형
'알고리즘 문제 풀이 > BOJ' 카테고리의 다른 글
[백준 BOJ][C++]7576번 토마토 풀이: BFS/DFS (0) | 2022.02.28 |
---|---|
[백준 BOJ][C++]4963번 섬의 개수 풀이: DFS/BFS (0) | 2022.02.27 |
[백준 BOJ][C++]2468번 안전 영역 풀이: DFS/BFS (0) | 2022.02.27 |
[백준 BOJ][C++]1987번 알파벳 풀이: DFS/BFS (0) | 2022.02.27 |
[백준 BOJ][C++]11724번 연결 요소의 길이 풀이: BFS/DFS (0) | 2022.02.27 |