概述
题意:如图6-8所示,可以用四分树来表示一个黑白图像,方法是用根结点表示整幅图像,然后把行列个分城两等分,按照图中的方式编号,从左到右对应4个子结点。如果某子结点对应的取余全白或全黑,则直接用一个黑结点或者白结点表示:如果即有黑又有白,则用一个灰结点表示,并且为这个区域递归建树。
给出两棵四分树的先序遍历,求二者合并之后(黑色部分合并)黑色像素的个数。p表示中间结点,f表示黑色(full),e表示白色(empty)。
每个图的大小都为32*32,输出黑色块的个数。
思路:图非常小,把黑色的都置为1,并统计个数即可。根据先序遍历,把这个图画出来即可。遍历传四个值,当前到的字符串位置p,当前子树左上角坐标(x,y),当前子树边长w。
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1200;// 2^10 ↑
char s[MAXN];
int MAP[35][35], p, cnt;// 2^5 ↑
void draw(int &p, int x, int y, int w)
{
char ch = s[p++];
if (ch == 'p')
{
draw(p, x, y+w/2, w/2); // 1
draw(p, x, y, w/2); // 2
draw(p, x+w/2, y, w/2); // 3
draw(p, x+w/2, y+w/2, w/2);// 4
}
else if (ch == 'f')
{
for (int i = x; i < x+w; i++)
{
for (int j = y; j < y+w; j++)
{
if (MAP[i][j] == 0) MAP[i][j] = 1, cnt++;
}
}
}
}
int main()
{
int T; scanf("%d", &T);
while (T--)
{
memset(MAP, 0, sizeof(MAP)); cnt = 0;
scanf("%s", s); p = 0;
draw(p, 0, 0, 32);
scanf("%s", s); p = 0;
draw(p, 0, 0, 32);
printf("There are %d black pixels.n", cnt);
}
return 0;
}
/*
3
ppeeefpffeefe
pefepeefe
peeef
peefe
peeef
peepefefe
*/
最后
以上就是光亮橘子为你收集整理的UVA ~ 297 ~ Quadtrees (四分树)的全部内容,希望文章能够帮你解决UVA ~ 297 ~ Quadtrees (四分树)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复