用四叉树表示像素图,然后把两张图像叠加,同时遍历两棵树,计算叠加后总的黑像素个数
#include<stdio.h> #include<string.h> #include<stdlib.h> struct node{ int d; char c; node* child[4]; }; char a[9999999],b[9999999]; int pos; int fenj[]={1024,256,64,16,4,1}; node * root1;node *root2; int count(node* p) { int val=0; if(p->c=='f') val+=fenj[p->d]; else if(p->c=='p') { for(int i=0;i<4;i++) val+=count(p->child[i]); } return val; } node* build(node* p,char* str,int d) { pos++; if(pos==strlen(str)) return NULL; p=new node; p->c=str[pos]; p->d=d; for(int i=0;i<4;i++) p->child[i]=NULL; if(str[pos]=='p') { for(int i=0;i<4;i++) { p->child[i]=build(p->child[i],str,d+1); } } return p; } int comb(node *p1,node *p2) { int val=0; if(p1->c=='p'&&p2->c=='p') { for(int i=0;i<4;i++) val+=comb(p1->child[i],p2->child[i]); } else if(p1->c=='f'||p2->c=='f') val+=fenj[p1->d]; else if(p1->c=='e'||p2->c=='p') val+=count(p2); else if(p1->c=='p'||p2->c=='e') val+=count(p1); return val; } int main() { int i,j,n; scanf("%d",&n); while(n--) { scanf("%s%s",&a,&b); pos=-1; root1=build(root1,a,0); pos=-1; root2=build(root2,b,0); int val=comb(root1,root2); printf("There are %d black pixels.\n",val); } return 0; }