说说:
先来说说题意,题目给定了一个32*32大小(相当于1024个1*1的小正方形合成)的正方形,如下图所示:
其实每个大正方形可以看成一个树根,它由四个小正方形组成,四个小正方形为孩子。当然,我们可以立即给小正方形上色,黑色或白色,还可以把小正方形再细分成更小的四个正方形,直至正方形的大小为1*1为止。现在题目给你两个字符串,例如:
ppeeefpffeefe
pefepeefe其中p表示该节点不是叶子节点,e表示为白色的叶子节点,f为黑色的叶子节点。整个字符串是先序遍历的结果。要求求出两个这样的正方形叠加,最后形成的正方形中1*1的黑色小方格的数目。开始我的做法是,分别遍历两棵树,求出每棵树黑色小正方形的数目,然后将两个值叠加。但后来发现不对,因为两个正方形有重叠的部分。因此只能构建一个数组,代表1024个小正方形。然后再遍历两棵树,当遇到黑色叶子节点时,将相应区间内的数组置位即可。
源代码:
#include <stdio.h>
#include <string.h>
char ans[1024];//1024个最小的方格
void search(int,int);
int main(){
int N,result,i;
char c;
// freopen("data","r",stdin);
scanf("%d",&N);
while((c=getchar())!='\n');
while(N--){
memset(ans,0,sizeof(ans));
search(0,1024);
getchar();
search(0,1024);
getchar();
result=0;
for(i=0;i<1024;i++)
if(ans[i]==1)
result++;
printf("There are %d black pixels.\n",result);
}
return 0;
}
void search(int begin,int end){//begin和end为当前节点覆盖的小方格的区间
char c;
int i,j,add=(end-begin)/4;
c=getchar();
if(c=='f'){//黑色叶子节点
for(j=begin;j<end;j++)
ans[j]=1;
return;
}
else if(c=='p'){//非叶子节点则要遍历四棵子树
for(i=0;i<4;i++){
if((c=getchar())=='f'){//若子树即为叶子节点,直接操作
for(j=begin;j<begin+add;j++)
ans[j]=1;
}
else if(c=='p'){
ungetc(c,stdin);
search(begin,begin+add);
}
begin+=add;
}
}
return;
}
原文地址:http://blog.csdn.net/u011915301/article/details/39234801