【DFS】UVa297 - Quadtrees

题意

一幅像素点为1024的黑白图,可以将图等分为4块,子图可以继续等分为4块,直到最小子图为1。给出两个黑白图,黑色面积的家和。用先序遍历的四叉树表示每个图,p:父节点,f:涂黑,e:白色。图的节点顺序如下:

┌ ┬ ┐

|2|1|

├ ┼ ┤

|3|4|

└ ┴ ┘

思路

建立一个32*32的矩阵,r表示行,c表示列,值为1表示黑,0表示白;DFS这棵树即可。pic[r][c]表示现在这个子图的左上角。

总结

也是看着书写的,不过这回稍微明白点了dfs这个鬼,感觉这个不能细想,要抽象着来,加油哦

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <string>
 5 #include <cstring>
 6 const int maxn = 32;
 7 using namespace std;
 8 int pic[maxn][maxn],cnt;
 9 void draw(const string a,int &p,int r,int c,int w)  //p一定要是引用
10 {
11     char ch = a[p++]; 
12     if(ch == 'p') {
13         draw(a,p,r,c+w/2,w/2);    //1
14         draw(a,p,r,c,w/2);        //2
15         draw(a,p,r+w/2,c,w/2);    //3
16         draw(a,p,r+w/2,c+w/2,w/2);//4
17     }
18     else if(ch == 'f') {
19         for(int i = r; i < r+w; i++)   
20             for(int j = c; j < c+w; j++)
21                 if(!pic[i][j]) {
22                     pic[i][j] = 1;
23                     cnt++;
24                 }
25     }
26 }
27 int main()
28 {
29     int T;
30     cin >> T;
31     while(T--) {
32         cnt = 0;
33         memset(pic,0,sizeof pic);
34         string a,b;
35         cin >> a >> b;
36         int p = 0;
37         draw(a,p,0,0,maxn);
38         p = 0;
39         draw(b,p,0,0,maxn);
40         printf("There are %d black pixels.\n",cnt);
41     }
42     return 0;
43 }

 

转载于:https://www.cnblogs.com/kikii233/p/5866154.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值