본문으로 바로가기

백준 01780 - 종이의 개수

category BOJ 백준/Divide & Conquer 2020. 11. 11. 07:46

출처 : https://www.acmicpc.net/problem/1780 

 

1780번: 종이의 개수

N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1의 세 값 중 하나가 저장되어 있다. 우리는 이 행렬을 적절한 크기로 자르려고 하는데, 이때 다음의 규칙에 따라 자르려고 한다.

www.acmicpc.net

 

고려사항

  • 색종이 만들기 문제의 분할 크기 차이만 있을 뿐 똑같은 문제.
  • 분할 정복 기법 사용.
  • -1, 0, 1 타입이 지정되어 있으니 len == 1 이었는데 isComplete 하지 못하다면 0 return 해주기

 

#include <iostream>
using namespace std;

int paper[2187][2187];

int divide(int y, int x, int len, int type){
    bool isComplete = true;
    int cnt = 0;

    for(int i=0;i<len;++i){
        for(int j=0;j<len;++j){
            if(type != paper[i+y][j+x]){
                isComplete = false;
                break;
            }
        }
    }

    if(isComplete){
        return 1;
    }

    if(len == 1){
        return 0;
    }

    for(int i=0;i<3;++i){
        for(int j=0;j<3;++j){
            cnt += divide(y+i*len/3, x+j*len/3, len/3, type);
        }
    }

    return cnt;
}

int main() {
    int n;

    cin>>n;
    for(int i=0;i<n;++i){
        for(int j=0;j<n;++j){
            cin>>paper[i][j];
        }
    }

    cout<<divide(0, 0, n, -1)<<"\n";
    cout<<divide(0, 0, n, 0)<<"\n";
    cout<<divide(0, 0, n, 1)<<"\n";

    return 0;
}

'BOJ 백준 > Divide & Conquer' 카테고리의 다른 글

백준 11444 - 피보나치 수 6  (0) 2020.11.11
백준 01629 - 곱셈  (0) 2020.11.11
백준 01992 - 쿼드트리  (0) 2020.11.08
백준 02630 - 색종이 만들기  (0) 2020.11.08