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.\n", cnt); 51 52 return 0; 53 }