안 쓰던 블로그

1780 종이의 개수 본문

알고리즘/정보올림피아드 준비

1780 종이의 개수

proqk 2016. 12. 17. 10:30
반응형

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
#include <stdio.h>
 
int n, m[3000][3000], res[3];
 
void solve(int x, int y, int size) {
    int paper = m[y][x];
    int same = true;
    
    for (int i = y; (i < y + size&& same; i++) { //위부터 아래까지 같으면 계속가고 틀리면 빠져나옴
        for (int j = x; (j < x + size&& same; j++) { //왼쪽부터 오른쪽까지
            if (paper != m[i][j]) { //배열의 x, y번째 비트랑 검사한 곳이랑 다르면 아래서 분할 
                same = false
            }
        }
    }
    if (same) res[paper+1]++; //같으면 개수를 셈
    else { //아니면 분할
        solve(x, y, size / 3); //왼쪽 위
        solve(x + (size / 3), y, size / 3); //중간 위
        solve(x + (size / 3* 2, y, size / 3); //오른쪽 위
 
        solve(x, y + (size / 3), size / 3); //왼쪽 중간
        solve(x + (size / 3), y + (size / 3), size / 3); //중간 중간
        solve(x + (size / 3* 2, y + (size / 3), size / 3); //오른쪽 중간
 
        solve(x, y + (size / 3* 2size / 3); //왼쪽 아래
        solve(x + (size / 3), y + (size / 3* 2size / 3); //중간 아래
        solve(x + (size / 3* 2, y + (size / 3* 2size / 3); //오른쪽 아래
    }
}
 
 
int main() {
    scanf("%d"&n);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d"&m[i][j]);
        }
    }
    solve(00, n);
    
    for (int i = 0; i < 3; i++) {
        printf("%d\n", res[i]);
    }
}
cs


-1, 0, 1로 이루어진 종이가 있고 9개가 같은 숫자가 아니라면 9개로 분할해나가는 문제다.

간단한 분할 정복으로, 쿼드 트리(http://foxtrotin.tistory.com/73)와 같은 방법으로 풀 수 있다.


for문을 돌면서 틀린 부분이 나올 때까지 검사하고


size를 3으로 나눠 9등분 한 종이의 한 조각의 크기를 구하고 x, y에다가 적당히 더하면서

왼쪽 위에서부터 오른쪽 아래까지 전부 노가다로 적으면 해결된다.



반응형

'알고리즘 > 정보올림피아드 준비' 카테고리의 다른 글

정올 고급 강의 7~8차시 정리  (0) 2017.01.09
정올 고급 강의 1~6차시 정리  (0) 2016.12.17
1992 쿼드 트리  (0) 2016.12.17
11727 2xn 타일링2  (0) 2016.12.16
11726 2xn 타일링  (0) 2016.12.16
Comments