题目:297 - Quadtrees
题目大意:给两个四叉树,合并成一个四叉数,并求最后的那个四叉树的黑色的面积。
解题思路:1、我是先忽略第一个根节点来建树的,所以要考虑第一个为1,和为0的情况。
2、将字符串转换成对应的数的数组,p为2,f为1,e为0, 需要buildtree();建树的时候可以用递归,因为每个p对应都有四个孩子,如果孩子里面还有p的话就再次调用buildtree()。直到为‘\0’就结束。
3、然后将两个数组合并,特别要考虑1,和0合并的情况。要将这两个数的孩子都变为0.需要一个merge();
4、最后就要统计黑色的大小,因为最多5层,所以可以列举出来下标为多少到多少是第n层的(不包扩第一个根节点)。第n层的黑色圈的就是1024/ 4^n;
#include<stdio.h> #include<string.h> #include<math.h> const int N = 32; const int M = 1365; char str1[10000], str2[10000]; int s[2][M], n, t; void buildtree1(int i) { int k = (i + 1) * 4; for(int j = 0; j < 4; j++) { n++; if(str1[n] == 'p') { s[0][k + j] = 2; buildtree1(k + j); } else if(str1[n] == 'e') s[0][k + j] = 0; else if(str1[n]== 'f') s[0][k + j] = 1; else if(str1[n] == '\0') return; } } void buildtree2(int i) { int k = (i + 1) * 4; for(int j = 0; j < 4; j++) { n++; if(str2[n] == 'p') { s[1][k + j] = 2; buildtree2(k + j); } else if(str2[n] == 'e') s[1][k + j] = 0; else if(str2[n]== 'f') s[1][k + j] = 1; else if(str2[n] == '\0') return; } } void merge(int i) { int j = (i + 1) * 4; for(int m = 0; m < 4; m++) { if(j + m >= M ) return ; else { s[0][j + m] = s[1][j + m] = 0; merge(j + m); } } } int main() { scanf("%d", &t); while(t--) { int count = 0, i; n = 0; memset(s, 0, sizeof(s)); scanf("%s%s", &str1, &str2); if(strlen(str1) != 1) buildtree1(-1); else { if(str1[0] == 'f') { printf("There are 1024 black pixels.\n"); continue; } } if(strlen(str2) != 1) { n = 0; buildtree2(-1); } else { if(str2[0] == 'f') { printf("There are 1024 black pixels.\n"); continue; } } if(str1[0] == 'e' && str2[0] == 'e') { printf("There are 0 black pixels.\n"); continue; } for(i = 0; i < M; i++) { if((s[0][i] == 2 && (s[1][i] == 2 || s[1][i] == 0)) || (s[1][i] == 2 && (s[0][i] == 2 || s[0][i] == 0)) ) continue; if((s[0][i] == 2 && s[1][i] == 1 )|| (s[1][i] == 2 && s[0][i] == 1)) { s[0][i] = 1; merge(i); continue; } if(s[0][i] + s[1][i] == 1) s[0][i] += s[1][i]; } int sum = 0, num, d; for(i = 0; i < M; i++) { if(s[0][i] == 1) { num = i; if(num >= 0 && num <= 3) d = 1; else if(num >= 4 && num <= 19) d = 2; else if(num >= 20 && num <= 83) d = 3; else if(num >= 84 && num <= 339) d = 4; else if(num >= 340 && num <= 1364) d = 5; sum += 32 * 32 /(int) pow(4, d); } } printf("There are %d black pixels.\n", sum); } return 0; }