문제
풀이
쿼드트리와 비슷한 문제이다. 이 문제는 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);
}