297 - Quadtrees

来源:互联网 发布:软件著作权和知识产权 编辑:程序博客网 时间:2024/05/01 23:07

题目: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;}


0 0
原创粉丝点击