这道题死活WA…不知道为什么,uDebug上的数据也全部过了。。。就先在这里挖个坑以后再来填
1.这里的p必须传引用来求解,这样才能够体现“递归”的特性:当出现p的时候,依次处理后面四坨子树,而子树的节点数不一定为1,所以要一个一个来。
#include<cstdio>
#include<cstring>
using namespace std;
const int lent=32;
const int maxn=1024+10;
int cnt=0;
int tu[lent][lent]={0};
char s[maxn];
void draw(char *s,int &pos,int left,int up,int len){//必须传地址
// printf("%p\n",pos);
// if(s[pos]=='\0'){
// return;
// }
char ch=s[pos++];// 这一步很重要,先储存这一个节点所需要的操作,再移动坐标。如果坐标溢出也没事,因为坐标溢出的话代表这个点不是p,所以不需要进行操作。
if(ch=='p'){//已经自带出口条件了
draw(s,pos, left+len/2 ,up ,len/2);
draw(s,pos, left ,up ,len/2);
draw(s,pos, left ,up+len/2 ,len/2);
draw(s,pos, left+len/2 ,up+len/2 ,len/2);
}
else if(ch=='f'){
// printf("%d",len);
for(int i=up;i<up+len;i++){//这里只针对这一个节点的操作,所以区域是len而不是Len/2
for(int j=left;j<left+len;j++){
if(tu[i][j]==0){
tu[i][j]=1;
cnt++;
}
}
}
}
}
int main(void){
int t;
scanf("%d",&t);
// FILE * f =fopen("C:\\Users\\wrnge\\Desktop\\ACM\\UVA297","w");
while(t--){
memset(tu,0,sizeof(tu));
cnt=0;
scanf("%s",s);
// printf("%c",s[2]);
// puts(s);
int p=0;
draw(s,p,0,0,32);
// printf("%d",p);
scanf("%s",s);
p=0;
draw(s,p,0,0,32);
// int ct=0;
// for(int i=0;i<32;i++){
// for (int j=0;j<32;j++){
// if(tu[i][j]){
// ct++;
// }
// }
// }
printf("There are %d black pixels.\n",cnt);
// fprintf(f,"There are %d black pixels.\n",cnt);
}
// fclose(f);
return 0;
}