본문 바로가기
백준

[백준] 2583 - 영역 구하기, C++

by 황인태(intaehwang) 2020. 1. 7.
반응형

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

 본 문제는 2006 한국정보올림피아드 지역 본선 고등부 2번 문제다. 빈 공간을 찾고 빈 공간의 개수를 구하는 BFS문제다. 그러나 입력되는 데이터가 배열 index의 순서와 다르기 때문에 입력된 정보를 배열에 맞게 바꿔야 한다. 입력되는 데이터는 왼쪽 아래 꼭짓점의 x, y 좌표값과 오른쪽 위 꼭짓점의 x, y 좌표값이 들어온다. 이 정보를 배열로 바꾸는 것이 문제의 핵심이다.

  1. 사각형 개수를 구한다.
  2. 사각형의 시작 위치를 구한다.
  3. 사각형이 아닌 구역을 구한다.

 

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
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
 
using namespace std;
 
int v[100][100= {0};
int dx[] = {1-100};
int dy[] = {001-1};
bool chk[100][100];
 
int main() {
    int n, m, k, a, b, c, d, x, y;
    scanf("%d %d %d"&n, &m, &k);
    for (int t = 0; t < k; t++) {
        scanf("%d %d %d %d"&a, &b, &c, &d);
        x = d - b; // 사각형의 새로 개수
        y = c - a; // 사각형의 가로 개수
        // 사각형 시작 위치 = (b, a);
        for (int i = b; i < b+x; i++) {
            for (int j = a; j < a+y; j++) {
                v[i][j] = 1;
            }
        }
    }
    vector<int> ans;
    queue<pair<intint>> q;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (v[i][j] == 0 && !chk[i][j]) {
                q.push(make_pair(i, j));
                chk[i][j] = true;
                int cnt = 0;
                while (!q.empty()) {
                    int x = q.front().first;
                    int y = q.front().second;
                    cnt += 1;
                    q.pop();
                    for (int k = 0; k < 4; k++) {
                        int nx = x + dx[k];
                        int ny = y + dy[k];
                        if (nx >= 0 && nx < n && ny >= 0 && ny < m) {
                            if (v[nx][ny] == 0 && !chk[nx][ny]) {
                                q.push(make_pair(nx, ny));
                                chk[nx][ny] = true;
                            }
                        }
                    }
                }
                ans.push_back(cnt);
            }
        }
    }
    sort(ans.begin(), ans.end());
    printf("%d\n", ans.size());
    for (int i = 0; i < ans.size(); i++) {
        printf("%d", ans[i]);
        if (i != ans.size()-1printf(" ");
    }
    return 0;
}
cs
반응형

'백준' 카테고리의 다른 글

[백준 2468] 안전 영역, C++  (0) 2020.01.07
[백준 6603] 로또, C++  (0) 2020.01.07
[백준] 11403 - 경로 찾기, C++  (0) 2020.01.07
[백준] 1697 - 숨바꼭질, C++  (0) 2020.01.06
[백준] 1012 - 유기농 배추, C++  (0) 2020.01.06
Buy me a coffeeBuy me a coffee

댓글