297 - Quadtrees (四叉树)

题目链接:

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;
}
 

 

posted @ 2012-10-20 23:12  godjob  Views(1712)  Comments(0Edit  收藏  举报