#95. [백준_C언어] 1780 : 종이의 개수 \ 분할 정복

 

입력 코드

#include <stdio.h>

#define MAX 2187
#define TRUE 1
#define FALSE 0

int arr[MAX][MAX];
int count[3];

int checkbox(int x, int y, int w, int color)
{
	for (int i = 0; i < w; i++)
		for (int j = 0; j < w; j++)
			if (arr[x + i][y + j] != color)
				return FALSE;
	return TRUE;
}

void splitbox(int x, int y, int w)
{
	if (checkbox(x, y, w, arr[x][y]))
		count[arr[x][y] + 1]++;
	else
		for (int i = 0; i < 3; i++)
			for (int j = 0; j < 3; j++)
				splitbox(x + i * w / 3, y + j * w / 3, w / 3);
}

int main()
{
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			scanf("%d",&arr[i][j]);
	splitbox(0, 0, n);
	for (int i = 0; i < 3; i++)
		printf("%d\n", count[i]);

	return 0;
}

출처 www.acmicpc.net/source/25218156

 

 

코드 설명

#분할정복 #재귀

 

 

참고

chanhuiseok.github.io/posts/baek-13/

 

[백준] 1780번 - 종이의 개수

컴퓨터/IT/알고리즘 정리 블로그

chanhuiseok.github.io

 

 

문제 출처

www.acmicpc.net/problem/1780

 

1780번: 종이의 개수

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

www.acmicpc.net