-

[DFS] 백준 2583번 - 영역 구하기 (정답률 56%) 본문

3. DFS & 백트래킹

[DFS] 백준 2583번 - 영역 구하기 (정답률 56%)

asdklfjlasdlfkj 2020. 1. 13. 17:44

https://www.acmicpc.net/problem/2583

 

2583번: 영역 구하기

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

www.acmicpc.net

백준 DFS 연습 문제다.

기존 2d 배열구조와 다른 좌표설정으로 문제에서 주어진 좌표들에 대해 변환작업을 고민해봐야한다.

이런것은 종이에 그림을 그리고 직접 해보며 규칙을 발견하면 된다.

 

아래는 dfs로 구현한 코드. (0ms)

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include<iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
vector<vector<bool> > map;
int M, N, K;
int small_ans;
vector<int> answer;
typedef struct dir{
    int dr, dc;
};
dir direction[4= { { 01 }, { 0-1 }, { 10 }, { -10 } };
 
void dfs(int r, int c){
    for (int i = 0; i < 4; i++){
        int nr = r + direction[i].dr;
        int nc = c + direction[i].dc;
        if (nr >= 0 && nr < M && nc >= 0 && nc < N){
            if (!map[nr][nc]){
                map[nr][nc] = true;
                small_ans++;
                dfs(nr, nc);
            }
        }
    }
}
 
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
 
    cin >> M >> N >> K;
    map.assign(M, vector<bool>(N, false));
 
    for (int i = 0; i < K; i++){
        int x1, y1, x2, y2;
        cin >> x1 >> y1 >> x2 >> y2;
        for (int r = M - y2; r < M - y1; r++){
            for (int c = x1; c < x2; c++){
                map[r][c] = true;
            }
        }
    }
    // 좌표 변환 및 true화 완료.
    for (int i = 0; i < M; i++){
        for (int j = 0; j < N; j++){
            if (!map[i][j]){
                small_ans = 0;
                map[i][j] = true;
                small_ans++;
                dfs(i, j);
                answer.push_back(small_ans);
            }
        }
    }
    sort(answer.begin(), answer.end());
    cout << answer.size() << '\n';
    for (int i = 0; i < answer.size(); i++){
        cout << answer[i] << " ";
    }
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

Comments