본문 바로가기
알고리즘/백준

[백준/C,C++] 1780번: 종이의 개수

by 이민훈 2021. 3. 19.

www.acmicpc.net/problem/1780

 

1780번: 종이의 개수

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

www.acmicpc.net

쿼드트리 문제인데 4(2x2)개로 분할하는게 아닌, 9(3x3)개로 분할하는 문제입니다.

#include<iostream>
#include<cmath>

using namespace std;

const int MAX = 2187;

int n;
int paper[MAX][MAX];
int cnt[3];

void dv(int x, int y, int len)
{
    if (len == 0) return;
    int value[3] = { 0, };
    for (int i = y; i < y + len; i++) {
        for (int j = x; j < x + len; j++) {
            if (paper[i][j] == -1) value[0]++;
            else if (paper[i][j] == 0) value[1]++;
            else value[2]++;
        }
    }
    for (int i = 0; i < 3; i++) {
        if (value[i] == len * len) {
            cnt[i]++;
            return;
        }
    }
    int next = len / 3;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            dv(x + next * i, y + next * j, next);
        }
    }
    return;
}

int main(void)
{
    cin >> n;

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

    dv(0, 0, n);

    for (int i = 0; i < 3; i++) {
        cout << cnt[i] << endl;
    }

    return 0;
}

'알고리즘 > 백준' 카테고리의 다른 글

[백준/C,C++] 11051번: 이항 계수 2  (0) 2021.03.26
[백준/C,C++] 1629번: 곱셈  (0) 2021.03.25
[백준/C,C++] 1992번: 쿼드트리  (0) 2021.03.17
[백준/C,C++] 2630번: 색종이 만들기  (0) 2021.03.17
[백준/C,C++] 5430번: AC  (0) 2021.03.16

댓글