首页 > 代码库 > Uva 297 四分树

Uva 297 四分树

题意:

有一个大小为32*32的图像, 它可以描述为一颗四分树, 如下图

注意描述顺序为

2 1

3 4

技术分享

 

给出两棵四分树的先序遍历, 求两者合并后, 黑色像素的个数。

分析:

因为本题给的树是一颗完全的树, 所以只需要给出先序遍历, 就能确定整棵树。

我们可以建一个32*32的数组模拟涂色的过程, 是一个锻炼递归的好题目, 递归的代码通常也可以写的很简便。

每次确定一个左上角坐标(r,c), 和长度len,就可以把一个矩形区域填充。

最后数一下填充多少个即可。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5;
const int len = 32;
int buf[len][len], cnt;
char s[maxn];
// 2 1
// 3 4
int draw(int& p, int r, int c,int len){
    char ch = s[p++];
    if(ch == p){
        draw(p,r,c+len/2, len/2);
        draw(p,r,c      , len/2);
        draw(p,r+len/2,c, len/2);
        draw(p,r+len/2,c+len/2, len/2);
    }else if(ch == f){
        for(int i = r; i < r+len; i++){
            for(int j = c; j < c +len; j++){
                if(buf[i][j] == 0) {
                    buf[i][j] = 1;
                    cnt++;
                }
            }
        }
    }
}
int main(){
   int T;
   scanf("%d", &T);
   while(T--){
        memset(buf,0,sizeof(buf));
        cnt = 0;
        for(int i=  0; i < 2; i++){
            scanf("%s", s);
            int p = 0;
            draw(p , 0 , 0, len);
        }
        printf("There are %d black pixels.\n",cnt);
   }

}

 

Uva 297 四分树