zoukankan      html  css  js  c++  java
  • 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;
    }
     
    
  • 相关阅读:
    转载
    转载
    HDU
    HDU
    Hdu
    转载
    HDU
    UVa
    HDU
    POJ
  • 原文地址:https://www.cnblogs.com/UnGeek/p/2732753.html
Copyright © 2011-2022 走看看