欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

非二叉树 UVA297 四分树 Quadtrees

程序员文章站 2022-06-09 21:25:36
...

UVA297 四分树 Quadtrees
非二叉树 UVA297 四分树 Quadtrees
题意翻译
如图所示,可以用四分图来表示一个黑白图像,方法是用根节点表示整幅图像,然后把行列个分成两等份,按图中的方式编号,从左到右对应4个子节点。如果某子节点对应的区域全黑或全白,则直接用一个黑节点或白节点表示;如既有黑又有白,则用一个灰节点表示,并且为这个区域递归建树。 给出两棵四分树的先序遍历,求二者合并(黑色部分合并)黑像素的个数(每幅图都是32X32的)。p表示灰节点,f表示黑节点,e表示白节点。 具体内容看原文和紫书。
输入:

3
ppeeefpffeefe
pefepeefe
peeef
peefe
peeef
peepefefe

输出:

There are 640 black pixels.
There are 512 black pixels.
There are 384 black pixels.
#include<bits/stdc++.h>
using namespace std;
#define debug(x) cout<<"#  "<<x<<" "<<endl;
typedef long long ll;
const ll mod=2147483647;
const ll N=1e4+7;
const ll len=32;
ll val[len][len],cnt;
string s;
// 把字符串s[p..]导出到以(r,c)为左上角,边长为w的缓冲区中
// 2 1
// 3 4
void draw(string s,ll &p,ll x,ll y,ll z)
{
    char ch=s[p++];
    if(ch=='p')
    {
        draw(s,p,x,y+z/2,z/2);
        draw(s,p,x,y,z/2);
        draw(s,p,x+z/2,y,z/2);
        draw(s,p,x+z/2,y+z/2,z/2);
    }
    else if(ch=='f')// 只画黑像素
    {
        for(int i=x;i<x+z;++i)
            for(int j=y;j<y+z;++j)
                if(!val[i][j])val[i][j]=1,cnt++;//只画一次
    }
}
int main()
{
    ll t;
    cin>>t;
    while(t--)
    {
        memset(val,0,sizeof val);
        cnt=0;
        for(int i=1;i<=2;i++)
        {
            ll p=0;
            cin>>s;
            draw(s,p,0,0,len);
        }
        printf("There are %lld black pixels.\n",cnt);
    }
    return 0;
}

相关标签: 树与二叉树