思路分析:
根据先序序列建立整个树,因为根据颜色即可判断结点有无孩子,即可知道序列中接下来的结点是不是子结点。
因为要把两个树加起来,只需要遍历两个字符串对应的二叉树即可,然后在同一个表示图的二维数组上叠加即可。
注意:对二维数组用fill()函数时候,首地址用buf[0]
题解:
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAX = 1024+10;
const int len = 32;
char s[MAX];
int buf[len][len] = {0}, cnt;
void draw(const char* s, int &p, int r, int c, int w){//在左上角为r,c宽度为w的正方形中画图,在字符串中位置为p,
char ch = s[p++];
if(ch == 'p'){
draw(s, p, r+w/2, c, w/2);
draw(s, p, r, c, w/2);
draw(s, p, r, c+w/2, w/2);
draw(s, p, r+w/2, c+w/2, w/2);
}else if(ch == 'f'){
for(int i = r; i < r+w; i++){
for(int j = c; j < c+w; j++){
if(!buf[i][j]){
buf[i][j] = 1;
cnt++;
}
}
}
}
}
int main(){
int T;
scanf("%d", &T);
while(T--){
cnt = 0;
fill(buf[0], buf[0]+32*32, 0);
for(int i = 0; i < 2; i++){
scanf("%s", s);
int p = 0;
draw(s, p, 0, 0, len);
}
printf("There are %d black pixels.\n", cnt);
}
return 0;
}