[BOJ] 1780번 종이의 개수 - C++

"분할정복"

Posted by Yongmin on June 23, 2021

문제

종이의 개수

풀이

쿼드트리와 비슷한 문제이다. 이 문제는 x,y 좌표 1/3씩 총 9개로 나눠서 합이 NxN이면 모두 1, -NxN이면 모두 -1, 그리고 0은 0이 아닌 수가 나오면 바로 bool 함수를 이용해서 false와 true로 구분해냈다.

소스 코드

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
65
66
67
68
69
70
71
72
#include <iostream>
#include <string.h>

using namespace std;


int map[2187][2187];

int cont_0, cont_1, cont_minus1;

void paper(int a, int x, int y){
    
    int temp = 0;
    
    for(int i = 0; i<a; i++){
        for(int j = 0; j<a; j++){
            temp = temp + map[x+i][y+j];
        }
    }
    
    bool zero = true;
    
    for(int i = 0; i<a; i++){
        for(int j = 0; j<a; j++){
            if(map[x+i][y+j] != 0){
                zero = false;
            }
        }
    }
    
    if(zero == true){
        cont_0++;
    }
    else if(temp == a*a){
        cont_1++;
    }
    else if(temp == -a*a){
        cont_minus1++;
    }
    else{
        paper(a/3, x+0, y+0);
        paper(a/3, x+0, y+a/3);
        paper(a/3, x+0, y+2*a/3);
        paper(a/3, x+a/3, y+0);
        paper(a/3, x+a/3, y+a/3);
        paper(a/3, x+a/3, y+2*a/3);
        paper(a/3, x+2*a/3, y+0);
        paper(a/3, x+2*a/3, y+a/3);
        paper(a/3, x+2*a/3, y+2*a/3);
    }
}

int main(){
    int N;
    scanf("%d", &N);
    
    
    for(int i = 0; i<N; i++){
        for(int j = 0; j<N; j++){
            int num;
            scanf("%d", &num);
            map[i][j] = num;
        }
    }
    
    paper(N, 0, 0);
    
    printf("%d\n", cont_minus1);
    printf("%d\n", cont_0);
    printf("%d\n", cont_1);
    
}


# # #