uva 297 Quadtrees

来源:互联网 发布:iis7端口设置 编辑:程序博客网 时间:2024/09/21 08:59

链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=4&page=show_problem&problem=233

题意是建立两颗树,让后将两棵树叠加到一起。每个结点如果值如果是e或者f就没有子结点,如果值是p,就有四个子结点。

代码写的很挫,每个结点的子结点可以用数组表示。

代码:

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<map>#include<queue>#include<stack>#include<vector>#include<ctype.h>#include<algorithm>#include<string>#define PI acos(-1.0)#define maxn 1005#define INF 1<<25#define MAX 0x7ffffffftypedef long long ll;using namespace std;char ss[maxn];struct Node{    char v;    Node *c1;    Node *c2;    Node *c3;    Node *c4;};Node *first;Node *second;Node *ans;int top;int aa;int Buildtree(Node *&node){    node=(Node*)malloc(sizeof(Node));    node->v=ss[top++];    if(node->v=='p')    {        Buildtree(node->c1);        Buildtree(node->c2);        Buildtree(node->c3);        Buildtree(node->c4);    }    return 0;}int Copytree(Node *&a,Node *&b){    b=(Node*)malloc(sizeof(Node));    b->v=a->v;    if(b->v=='p')    {        Copytree(a->c1,b->c1);        Copytree(a->c2,b->c2);        Copytree(a->c3,b->c3);        Copytree(a->c4,b->c4);    }}int Addtree(Node *&a,Node *&b,Node *&c){    c=(Node*)malloc(sizeof(Node));    if(a->v=='f'||b->v=='f')        c->v='f';    else if(a->v=='e'&&b->v=='e')        c->v='e';    else if(a->v=='p'&&b->v=='e')    {        c->v='p';        Copytree(a->c1,c->c1);        Copytree(a->c2,c->c2);        Copytree(a->c3,c->c3);        Copytree(a->c4,c->c4);    }    else if(a->v=='e'&&b->v=='p')    {        c->v='p';        Copytree(b->c1,c->c1);        Copytree(b->c2,c->c2);        Copytree(b->c3,c->c3);        Copytree(b->c4,c->c4);    }    else    {        c->v='p';        Addtree(a->c1,b->c1,c->c1);        Addtree(a->c2,b->c2,c->c2);        Addtree(a->c3,b->c3,c->c3);        Addtree(a->c4,b->c4,c->c4);    }}int dfs(Node *&node){    if(node->v=='f')    {        aa+=1024/top;    }    else if(node->v=='e')    {        return 0;    }    else if(node->v=='p')    {        top*=4;        dfs(node->c1);        dfs(node->c2);        dfs(node->c3);        dfs(node->c4);        top/=4;    }}int main(){    int tot;    scanf("%d",&tot);    for(int i=0; i<tot; i++)    {        aa=0;        scanf("%s",ss);        top=0;        Buildtree(first);        scanf("%s",ss);        top=0;        Buildtree(second);        Addtree(first,second,ans);        top=1;        dfs(ans);        printf("There are %d black pixels.\n",aa);    }}


0 0
原创粉丝点击