题意是建立两颗树,让后将两棵树叠加到一起。每个结点如果值如果是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 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<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); } }