是个挺简单的题,也是第一个完全自己打出来的题,值得庆贺~
题干里那个黑白点图其实没什么意思,直接看那颗树就能看懂了,就是通过先序构造出四叉树.假如读到p,就长出4个儿子,且该节点的值为0,它的儿子假如有值,则为本来应该赋给该节点值的1/4;假如读到f,那么这个节点被赋值,且不再往下长;假如读到e,那么不赋值,也没有儿子.每组输出为2行,是两棵树,然后要求输出两棵树的"合并"的权值.树的合并是指假如处于同一位置的节点在一棵树上赋过值,则不再读它的儿子,否则取两个值中较大的那个.
代码如下:
#include<bits/stdc++.h>
#define rep(i,a,n) for(i=a;i<=n;i++)
#define per(i,a,n) for(i=a;i>=n;i--)
#define maxn 1<<10
using namespace std;
struct node{
int val;
node* v1;
node* v2;
node* v3;
node* v4;
};
void read_t1(node* v,int value);
void read_t2(node* v,int value);
node* newnode();
void dfs(node* v);
int rnd,ans;
node* root;
int main(){
scanf("%d",&rnd);
while(rnd--){
root=newnode();
ans=0;
read_t1(root,1024);
read_t2(root,1024);
dfs(root);
printf("There are %d black pixels.\n",ans);
}
}
node* newnode(){
return new node();
}
void read_t1(node* v,int value){
char tmp;
cin>>tmp;
if(tmp=='p')
{
v->val=0;
v->v1=newnode();
v->v2=newnode();
v->v3=newnode();
v->v4=newnode();
read_t1(v->v1,value/4);
read_t1(v->v2,value/4);
read_t1(v->v3,value/4);
read_t1(v->v4,value/4);
}
else if(tmp=='f'){
v->val=value;
}
}
void read_t2(node* v,int value){
char tmp;
cin>>tmp;
if(v->val==0){
if(tmp=='f') v->val=value;
else if(tmp=='p'&&v->v1==NULL){
v->val=0;
v->v1=newnode();
v->v2=newnode();
v->v3=newnode();
v->v4=newnode();
read_t2(v->v1,value/4);
read_t2(v->v2,value/4);
read_t2(v->v3,value/4);
read_t2(v->v4,value/4);
}
else if(tmp=='p'&&v->v1!=NULL){
read_t2(v->v1,value/4);
read_t2(v->v2,value/4);
read_t2(v->v3,value/4);
read_t2(v->v4,value/4);
}
}
}
void dfs(node* v){
if(v->val){
ans+=v->val;return ;
}
else if(v->v1!=NULL){
dfs(v->v1);
dfs(v->v2);
dfs(v->v3);
dfs(v->v4);return ;
}
}