您的位置:首页 > 其它

297 - Quadtrees (四叉树)

2012-10-20 23:12 381 查看
题目链接:

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=233

题目类型: 数据结构, 二叉树

题意与背景:

同二叉树一样,四叉树也是一种数据结构,是一种每个节点最多有四个子树的数据结构。

一个四叉树是可以表示格式用于编码图像。背后的基本思想是, 任何图像可以分为四个象限,每个象限也可以再次被分割成4个亚象限,等等。因此四叉树是在二维图片中定位像素的唯一适合的算法。

当然, 如果一整幅图只有一种一种颜色,那么可以只用一个单一的节点表示。一般来说, 如果图片的像素的不同颜色组成,那么每个象限只需要再被细分下去。因此,四叉树不需要统一的深度。

现代计算机艺术家在黑白图像32*32单元下工作, 每幅图像总计有1024像素。其中一个需要执行的操作是添加两个图像,把它们合并形成一个新形象。两幅图像合并,在相对应的象限的像素中,只要一副中是黑色的,那么合并后该像素就是黑色的,否则就是白色的。

例如:



样例输入:

3
ppeeefpffeefe
pefepeefe
peeef
peefe
peeef
peepefefe


样例输出:

There are 640 black pixels.
There are 512 black pixels.
There are 384 black pixels.

第一次提交就AC了,可能不是很高效,但是


#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
struct QuadTree{
char color;
QuadTree *subTree[4];
};
string str_tree;
void init_subtree(QuadTree* tree)
{
int i =0;
while(i<4)
{
tree->subTree[i]=NULL;
i++;
}
}
int build_tree(int index,QuadTree**tree_node)
{
int i = 0;
if (index>=str_tree.length())
{
*tree_node=NULL;
return str_tree.length();
}
QuadTree* node = new QuadTree;
node->color=str_tree[index];
init_subtree(node);
*tree_node=node;
if (str_tree[index++]=='p')
{
while(i < 4)
{
if(str_tree[index]=='p')
{
index=build_tree(index,&node->subTree[i]);
}
else
{
node->subTree[i]=new QuadTree;
node->subTree[i]->color = str_tree[index];
init_subtree(node->subTree[i]);
index++;
}
i++;
}
}
return index;
}
void delete_tree(QuadTree * root)
{
if (root)
{
int i =0;
do
{
delete_tree(root->subTree[i]);
} while (++i<4);
delete root;
}
}
int it1,it2;
QuadTree * combine_tree(QuadTree* tree1 , QuadTree * tree2)
{
//如果其中一棵树是空树的话便返回非空树,都空则返回NULL
if (tree1 == NULL)
{
return tree2;
}
else if (tree2 == NULL)
{
return tree1;
}
if(tree1->color == 'f' || tree2->color == 'f')
{
delete_tree(tree2);
delete_tree(tree1);
tree1 = new QuadTree;tree1->color = 'f';
init_subtree(tree1);
return tree1;
}
int i =0;
if (tree2->color=='p')
{
tree1->color='p';
}
do
{
tree1->subTree[i]=combine_tree(tree1->subTree[i],tree2->subTree[i]);
} while (++i<4);
return tree1;
}
void test(QuadTree* root)
{
if (root)
{
int i = 0;
cout<<root->color<<endl;
do
{
test(root->subTree[i]);
} while (++i<4);
}
}
int move_bit;
int sum_black_bits;
void GetBlackBits(QuadTree *root,int dep )
{
if (root)
{
if (root->color =='f')
{
sum_black_bits+=1024>>dep*2;
}
int i =0;
do
{
GetBlackBits(root->subTree[i],dep+1);
} while (++i<4);
}
}
int main(int argc, char* argv[])
{
int n;
QuadTree *tree1 = NULL,*tree2 = NULL;
//freopen("c:\\data.txt","r",stdin);
cin>>n;
getchar();
while (n--)
{
getline(cin,str_tree);
build_tree(0,&tree1);
getline(cin,str_tree);
build_tree(0,&tree2);
QuadTree *tree = combine_tree(tree1,tree2);
sum_black_bits = 0;
GetBlackBits(tree,0);
delete_tree(tree);
cout<<"There are "<<sum_black_bits<<" black pixels."<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: