알고리즘/백준

1780>종이의 개수

Diademata 2018. 6. 22. 00:22
반응형
https://www.acmicpc.net/problem/1780

문제

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


1.만약 종이가 모두 같은 수로 되어 있다면 이 종이를 그대로 사용한다.

2.(1)이 아닌 경우에는 종이를 같은 크기의 9개의 종이로 자르고, 각각의 잘린 종이에 대해서 (1)의 과정을 반복한다.

이와 같이 종이를 잘랐을 때, -1로만 채워진 종이의 개수, 0으로만 채워진 종이의 개수, 1로만 채워진 종이의 개수를 구해내는 프로그램을 작성하시오.


입력

첫째 줄에 N(1≤N≤3^7, N은 3^k 꼴)이 주어진다. 다음 N개의 줄에는 N개의 정수로 행렬이 주어진다. 


code>>


#include<iostream>

int paper[2187][2187], count[3];

int max;

bool Check(int size, int x, int y)

{

auto value = paper[y][x];

for (int i = y; i < y + size; i++)

{

for (int ii = x; ii < x + size; ii++)

{

if (value != paper[i][ii])

return false;

}

}

return true;

}

void Recursion(int size, int x, int y)

{

if (size <= 0) return;

if (Check(size, x, y))

count[paper[y][x] + 1]++;

else

{

Recursion(size / 3, x, y);

Recursion(size / 3, x + size / 3, y);

Recursion(size / 3, x + size / 3 * 2, y);

Recursion(size / 3, x, y + size / 3);

Recursion(size / 3, x + size / 3, y + size / 3);

Recursion(size / 3, x + size / 3 * 2, y + size / 3);

Recursion(size / 3, x, y + size / 3 * 2);

Recursion(size / 3, x + size / 3, y + size / 3 * 2);

Recursion(size / 3, x + size / 3 * 2, y + size / 3 * 2);

}

}

int main()

{

std::ios::ios_base::sync_with_stdio(false);

std::cin >> max;

for (int i = 0; i < max; i++)

{

for (int ii = 0; ii < max; ii++)

std::cin >> paper[i][ii];

}

Recursion(max, 0, 0);

printf("%d\n%d\n%d\n", count[0], count[1], count[2]);

return 0;

}

반응형

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

9251>LCS  (0) 2018.08.04
1920>수 찾기  (0) 2018.06.24
2912>백설공주와 난쟁이  (0) 2018.06.13
7568>덩치  (0) 2018.06.09
1463>1로 만들기  (0) 2018.06.02