UVa 297 (四分树 递归) Quadtrees

题意:

有一个32×32像素的黑白图片,用四分树来表示。树的四个节点从左到右分别对应右上、左上、左下、右下的四个小正方区域。然后用递归的形式给出一个字符串代表一个图像,f(full)代表该节点是黑色的,e(empty)代表该节点是白色的,p表示灰色节点,即它还有子节点。

每组数据给出两幅图,求两幅图黑色像素合并以后的黑色像素的个数。

分析:

字符串是递归给出的,那么就递归地处理。遇到字符'p'就递归进去,遇到黑色色的就统计。

递归函数的参数有个是引用,标记读到字符串是哪一位了,简化了程序。

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 const int len = 32;
 5 const int maxn = 1024 + 10;
 6 char s[maxn];
 7 int buf[len][len], cnt;
 8 
 9 void draw(const char* s, int& p, int r, int c, int w)
10 {
11     char ch = s[p++];
12     if(ch == 'p')
13     {
14         draw(s, p, r, c+w/2, w/2);
15         draw(s, p, r, c, w/2);
16         draw(s, p, r+w/2, c, w/2);
17         draw(s, p, r+w/2, c+w/2, w/2);
18     }
19     else if(ch == 'f')
20     {
21         int i, j;
22         for(i = r; i < r+w; ++i)
23             for(j = c; j < c+w; ++j)
24                 if(buf[i][j] == 0)
25                 {
26                     buf[i][j] = 1;
27                     cnt++;
28                 }
29     }
30 }
31 
32 int main(void)
33 {
34     //freopen("in.txt", "r", stdin);
35 
36     int T;
37     scanf("%d", &T);
38     while(T--)
39     {
40         memset(buf, 0, sizeof(0));
41         cnt = 0;
42         int i;
43         for(i = 0; i < 2; ++i)
44         {
45             scanf("%s", s);
46             int p = 0;
47             draw(s, p, 0, 0, len);
48         }
49     }
50     printf("There are %d black pixels.
", cnt);
51 
52     return 0;
53 }
代码君
原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/3986456.html