uva 297 Quadtrees

2014-11-24 08:23:46 · 作者: · 浏览: 0

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

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

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

代码:

#include
  
   
#include
   
     #include
    
      #include
     
       #include
       #include
       
         #include
        
          #include
         
           #include
          
            #include
           
             #include
            
              #define PI acos(-1.0) #define maxn 1005 #define INF 1<<25 #define MAX 0x7fffffff typedef 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