抱着打死也不用链表的精神,我把这个题给写出来了(其实也蛮后悔的,感觉不用链表也不是很简洁)。
我的思路基本分两步,第一步先将两个字符串合成一个,这一步我的处理是非常麻烦的(本来预计没有这么麻烦的),分九种小的情况,其中有两种还需要进行特殊的递归处理;第二步相对比较简单,将合成的字符串用个递归函数模拟四叉树便可搞定 ~
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<string>
using namespace std;
char c[10000];
int count,k1,k2,f,k;
void Quadtrees(char *cc,int dep) //第二步处理,将合成的字符串模拟四叉树 ~
{
dep++;
for(int i=0; i<4; i++)
{
k++;
if(cc[k]=='f')
count+=1024/pow(4,dep);
else if(cc[k]=='p')
Quadtrees(c,dep);
}
return ;
}
int rec(char *t) // 对 'p' 与 'f' 相遇时,'p'的后续子树进行删除
{
for(int i=0; i<4; i++)
{
f++;
if(t[f]=='e'||t[f]=='f')
continue;
else if(t[f]=='p')
f=rec(t);
}
return f;
}
int deal_p(char *t,int kk) // 'p' 与 'e' 相遇时,'p'的后续子树的添加处理
{
for(int i=0; i<4; i++)
{
c[k++]=t[kk];
if(t[kk]=='f'||t[kk]=='e')
{
kk++;
}
else if(t[kk]=='p')
kk=deal_p(t,++kk);
}
return kk;
}
int conbination(char *a,char *b) // 将两个字符串合成一个,每个元素相合时,有9种情况
{
k1=0,k2=0,k=0;
memset(c,0,sizeof(c));
while(1)
{
if(a[k1]=='\0'&&b[k2]=='\0')
break;
if(a[k1]=='f'&&b[k2]=='p')
{
c[k]='f';
k1++;
f=k2;
k2=rec(b)+1;
k++;
}
else if(a[k1]=='p'&&b[k2]=='f')
{
c[k]='f';
k2++;
f=k1;
k1=rec(a)+1;
k++;
}
else if(a[k1]=='f'&&b[k2]=='f')
{
c[k++]='f';
k1++;
k2++;
}
else if(a[k1]=='f'&&b[k2]=='e')
{
c[k++]='f';
k1++;
k2++;
}
else if(a[k1]=='e'&&b[k2]=='f')
{
c[k++]='f';
k1++;
k2++;
}
else if(a[k1]=='e'&&b[k2]=='p')
{
c[k++]='p';
k2=deal_p(b,++k2);
k1++;
}
else if(a[k1]=='p'&&b[k2]=='e')
{
c[k++]='p';
k1=deal_p(a,++k1);
k2++;
}
else if(a[k1]=='p'&&b[k2]=='p')
{
c[k++]='p';
k1++;
k2++;
}
else if(a[k1]=='e'&&b[k2]=='e')
{
c[k++]='e';
k1++;
k2++;
}
else if(a[k1]=='\0') // 满足条件,将后续字符串拷入 c,然后结束
{
while(b[k2]!='\0')
{
c[k++]=b[k2++];
}
}
else if(b[k2]=='\0')
{
while(a[k1]!='\0')
{
c[k++]=a[k1++];
}
}
/ cout<<c<<" "<<k1<<" "<<k2<<" "<<k<<endl;
}
return 0;
}
int main()
{
#ifdef test
freopen("sample.txt","r",stdin);
#endif
int num;
char a[10000],b[10000];
scanf("%d",&num);
getchar();
while(num--)
{
k1=k2=count=0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
scanf("%s%s",a,b);
if(a[0]=='f'||b[0]=='f') // 若是全黑,直接处理
count=1024;
else
{
conbination(a,b);
k=0;
Quadtrees(c,0);
}
printf("There are %d black pixels.\n",count);
}
return 0;
}