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