본문 바로가기

알고리즘 문제

[C/C++ 백준 2630번] 색종이 만들기 (Silver 3)

https://www.acmicpc.net/problem/2630

 

2630번: 색종이 만들기

첫째 줄에는 전체 종이의 한 변의 길이 N이 주어져 있다. N은 2, 4, 8, 16, 32, 64, 128 중 하나이다. 색종이의 각 가로줄의 정사각형칸들의 색이 윗줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진다.

www.acmicpc.net

전의 문제와 같은 문제이다. 나누어서 1일 경우는 cnt2에 ++해주고, 0일 경우에는 cnt1에 ++해주면 쉽게 풀 수 있다.

 

#include <cstdio>
int cnt1=0, cnt2=0, array[128][128];
void func(int a, int b, int i, int j){
	bool zero = true;
	bool one = true;
	for(int q=a; q<b; q++){
		for(int w=i; w<j; w++){
			if(array[q][w]==0)
				one = false;
			if(array[q][w]==1)
				zero = false;
		}
	}
	if(one)
		cnt2++;
	if(zero)
		cnt1++;
	if(!one && !zero){
		func(a, (a+b)/2, i, (i+j)/2);
		func(a, (a+b)/2, (i+j)/2, j);
		func((a+b)/2, b, i, (i+j)/2);
		func((a+b)/2, b, (i+j)/2, j);
	}
}
int main(void){
	int N;
	scanf("%d", &N);
	for(int i=0; i<N; i++)
		for(int j=0; j<N; j++)
			scanf("%d", &array[i][j]);
	func(0, N, 0, N);
	printf("%d\n%d",cnt1,cnt2);
}