数据结构:四分树

紫书原题,UVA297

利用四叉树处理图片,给你两张黑白图片的四叉树,问两张图片叠加后黑色的面积

给出两颗四分树的先序遍历,求合并之后黑色像素的个数,p表示斑马结点,f表示黑色,e表示白色

四分树是一个神奇的树,只需要给出先序遍历就可以确定整棵树

四分树也可以用来实现二维线段树,只不过太恶心啦

 1 #include<cstdio>
 2 #include<cstring>
 3 const int len=32;
 4 const int maxn=1024+10;
 5 char s[maxn];
 6 int cnt;
 7 int buf[len][len];
 8 //把字符串s导出到以r,c为左上角,边长为w的缓冲区中
 9 //2 1
10 //3 4 
11 void draw(const char* s,int &p,int r,int c,int w)
12 {
13     char ch=s[p++];
14     if(ch=='p')
15     {
16         draw(s,p,r,c+w/2,w/2);  //1
17         draw(s,p,r,c,w/2);  //2
18         draw(s,p,r+w/2,c,w/2);  //3
19         draw(s,p,r+w/2,c+w/2,w/2);  //4
20     }
21     else if(ch=='f')  //画黑像素
22     {
23         for(int i=r;i<r+w;i++)
24             for(int j=c;j<c+w;j++)
25                 if(buf[i][j]==0)
26                 {
27                     buf[i][j]=1;cnt++;
28                 }
29     } 
30 }
31 int main()
32 {
33     int T;
34     scanf("%d",&T);
35     while(T--)
36     {
37         memset(buf,0,sizeof(buf));
38         cnt=0;
39         for(int i=0;i<2;i++)
40         {
41             scanf("%s",s);
42             int p=0;
43             draw(s,p,0,0,len);
44         }
45         printf("There are %d black pixels.
",cnt);
46     }
47     return 0;
48 }

有个BUG就是cnt放在前面就凉了,为啥呀

原文地址:https://www.cnblogs.com/aininot260/p/9530698.html