297 - Quadtrees

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


你可能感兴趣的:(297 - Quadtrees)