/** * 1st one: devide and conqer suggested by Leo Zhu */ void devide_and_conquer(int n, int* a) { /** * terminate condition * n == 2 */ if (n <= 2) return; int m = n / 2; int l = m / 2; /** * devide by shift right the middle part * * [0,l) [l, m, m+l) [m+l, n) */ shift_right(m, a+l, l); /** * conquer each sub part * [0, l) [l, 2l) [2l, n) */ devide_and_conquer(2*l, a); devide_and_conquer(n-2*l, a+2*l); }
void devide_and_conquer(int paper[][128], int x, int y, int size) { int half_size = size / 2; if(size != 1) { if(!is_available(paper, x, y, size)) { devide_and_conquer(paper, x, y, half_size); devide_and_conquer(paper, x + half_size, y, half_size); devide_and_conquer(paper, x, y + half_size, half_size); devide_and_conquer(paper, x + half_size, y + half_size, half_size); return ; } } switch(paper[x][y]) { case 1: pink_count++; break; case 0: wite_count++; break; } }
int main() { int n; int paper[128][128]; int i, j; scanf("%d", &n); for(i = 0 ; i < n ; i++) { for(j = 0 ; j < n ; j++) { scanf("%d", &paper[i][j]); } } devide_and_conquer(paper, 0, 0, n); printf("%d\n", wite_count); printf("%d\n", pink_count); return 0; }