[UVA297] Quadtrees 四叉树

来源:互联网 发布:红蚁网络运维 编辑:程序博客网 时间:2024/05/29 01:54


是个挺简单的题,也是第一个完全自己打出来的题,值得庆贺~

题干里那个黑白点图其实没什么意思,直接看那颗树就能看懂了,就是通过先序构造出四叉树.假如读到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<<10using 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 ;}}





0 0
原创粉丝点击