UVA 297 Quadtrees(四叉树建树、合并与遍历)
<span style="font-size: 18pt; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">K - </span><span style="color: blue; font-size: 18pt; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">Quadtrees</span>
Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld
& %llu
System Crawler (2014-01-02)
Description

Quadtrees |
A quadtree is a representation format used to encode images. The fundamental idea behind the quadtree is that any image can be split into four quadrants. Each quadrant may again be split in four sub quadrants,
etc. In the quadtree, the image is represented by a parent node, while the four quadrants are represented by four child nodes, in a predetermined order.
Of course, if the whole image is a single color, it can be represented by a quadtree consisting of a single node. In general, a quadrant needs only to be subdivided if it consists of pixels of different colors.
As a result, the quadtree need not be of uniform depth.
A modern computer artist works with black-and-white images of units, for a total
of 1024 pixels per image. One of the operations he performs is adding two images together, to form a new image. In the resulting image a pixel is black if it was black in at least one of the component images, otherwise it is white.
This particular artist believes in what he calls the preferred fullness: for an image to be interesting (i.e. to sell for big bucks) the most important property is the number of filled (black) pixels
in the image. So, before adding two images together, he would like to know how many pixels will be black in the resulting image. Your job is to write a program that, given the quadtree representation of two images, calculates the number of pixels that are
black in the image, which is the result of adding the two images together.
In the figure, the first example is shown (from top to bottom) as image, quadtree, pre-order string (defined below) and number of pixels. The quadrant numbering is shown at the top of the figure.
Input Specification
The first line of input specifies the number of test cases (N) your program has to process.
The input for each test case is two strings, each string on its own line. The string is the pre-order representation of a quadtree, in which the letter 'p' indicates a parent node, the letter 'f'
(full) a black quadrant and the letter 'e' (empty) a white quadrant. It is guaranteed that each string represents a valid quadtree, while the depth of the tree is not more than 5 (because each pixel has only one color).
Output Specification
For each test case, print on one line the text 'There are X black pixels.', where X is the number of black pixels in the resulting image.
Example Input
3
ppeeefpffeefe
pefepeefe
peeef
peefe
peeef
peepefefe
Example Output
There are 640 black pixels.
There are 512 black pixels.
There are 384 black pixels.
题意:有一个用四叉树表示的图,该图用P,E,F来表示,P表示父节点,F表示黑色,E表示白色,整个图的大小为1024。每个子图都能分成四个部分(当颜色不同的时候才须要划分),如今要把两个图合并成一个图,求合并后图有多少黑色像素。
#include<stdio.h>
#include<cstring>
#include<algorithm>
int T;
char s1[2049],s2[2049];
struct quadtree
{
int num;
quadtree *next[4];
quadtree()
{
num=0;
for(int i=0; i<4; i++)next[i]=0;
}
};
quadtree *build(char *s)///建树
{
quadtree *now=new quadtree;
int len=strlen(s);
if(s[0]!='p')
{
now->num=1;
if(s[0]!='f')
{
delete now;
now=NULL;
}
return now;
}
int up=4;///子树数目
int d=1;
for(int i=1; d<=up&&i<len; i++)
{
if(s[i]=='p')
{
now->next[d-1]=build(s+i);
int dx=0,dy=4;
while(dx<dy)
{
dx++;
if(s[i+dx]=='p')dy+=4;
}
i+=dx;///i变到下一颗子树的起始位置
}
else
{
now->next[d-1]=build(s+i);
}
d++;
}
return now;
}
quadtree *merge_(quadtree *p,quadtree *q)///合并
{
if(p||q)
{
quadtree *root=new quadtree;
if(p&&q)for(int i=0; i<4; i++)
{
if(p->num||q->num)
{
root->num=1; ///子树已经全为黑色,不须要继续递归
continue;
}
root->next[i]=merge_(p->next[i],q->next[i]);
}
else if(p==NULL&&q)for(int i=0; i<4; i++)
{
if(q->num)
{
root->num=1;; ///子树已经全为黑色,不须要继续递归
continue;
}
root->next[i]=merge_(NULL,q->next[i]);
}
else for(int i=0; i<4; i++)
{
if(p->num)
{
root->num=1;; ///子树已经全为黑色,不须要继续递归
continue;
}
root->next[i]=merge_(p->next[i],NULL);
}
return root;
}
return NULL;
}
int dfs(quadtree *p,int num)
{
if(p==NULL)return 0;
int sum=0;
if(p->num)sum+=num;
for(int i=0; i<4; i++)
{
sum+=dfs(p->next[i],num/4);
}
return sum;
}
int main()
{
//freopen("in.txt","r",stdin);
quadtree *root1,*root2,*root;
scanf("%d",&T);
while(T--)
{
scanf("%s%s",s1,s2);
root=root1=root2=NULL;
root1=build(s1);
root2=build(s2);
root=merge_(root1,root2);
printf("There are %d black pixels.\n",dfs(root,1024));
}
return 0;
}
UVA 297 Quadtrees(四叉树建树、合并与遍历)的更多相关文章
- UVA.297 Quadtrees (四分树 DFS)
UVA.297 Quadtrees (四分树 DFS) 题意分析 将一个正方形像素分成4个小的正方形,接着根据字符序列来判断是否继续分成小的正方形表示像素块.字符表示规则是: p表示这个像素块继续分解 ...
- UVa 297 Quadtrees(树的递归)
Quadtrees 四分树就是一颗一个结点只有4个儿子或者没有儿子的树 [题目链接]UVa 297 Quadtrees [题目类型]树的递归 &题意: 一个图片,像素是32*32,给你两个先序 ...
- uva 11234 Expressions 表达式 建树+BFS层次遍历
题目给出一个后缀表达式,让你求从下往上的层次遍历. 思路:结构体建树,然后用数组进行BFS进行层次遍历,最后把数组倒着输出就行了. uva过了,poj老是超时,郁闷. 代码: #include < ...
- UVA - 297 Quadtrees (四分树)
题意:求两棵四分树合并之后黑色像素的个数. 分析:边建树边统计. #include<cstdio> #include<cstring> #include<cstdlib& ...
- UVa 297 - Quadtrees
题目:利用四叉树处理图片,给你两张黑白图片的四叉树,问两张图片叠加后黑色的面积. 分析:搜索.数据结构.把图片分成1024块1*1的小正方形,建立一位数组记录对应小正方形的颜色. 利用递归根据字符串, ...
- uva 297 quadtrees——yhx
Quadtrees A quadtree is a representation format used to encode images. The fundamental idea behind ...
- UVa 297 Quadtrees -SilverN
A quadtree is a representation format used to encode images. The fundamental idea behind the quadtre ...
- 【紫书】Quadtrees UVA - 297 四叉树涂色
题意:前序遍历给出两个像素方块.求两个方块叠加后有几个黑色格子. 题解:每次读进来一个方块,就在二维数组上涂色.每次把白色涂黑就cnt++: 具体递归方法是以右上角坐标与边长为参数,每次通过几何规律往 ...
- Quadtrees UVA - 297
题目链接:https://vjudge.net/problem/UVA-297 题目大意:如上图所示,可以用一个四分树来表示一个黑白图像,方法是用根节点表示整副图像,然后把行列各等分两等分,按照图中的 ...
随机推荐
- dustjs
http://akdubya.github.io/dustjs/ https://github.com/linkedin/dustjs
- php实例-正则获取网站音频地址的实例(Listen to this 1)
主要用到了:file_get_contents();preg_match_all(); 这2个函数 查看地址:http://git.oschina.net/xiaoz6/phpExample
- ubuntu service
http://blog.chinaunix.net/uid-21528208-id-2399656.html
- 【Bzoj 3295】 动态逆序对(树套树|CDQ分治)
[题意] 每次删除一个数,然后问删除前逆序对数. [分析] 没有AC不开心.. 我的树状数组套字母树,应该是爆空间的,空间复杂度O(nlogn^2)啊..哭.. 然后就没有然后了,别人家的树套树是树状 ...
- 【poj3070】矩阵乘法求斐波那契数列
[题目描述] 我们知道斐波那契数列0 1 1 2 3 5 8 13…… 数列中的第i位为第i-1位和第i-2位的和(规定第0位为0,第一位为1). 求斐波那契数列中的第n位mod 10000的值. [ ...
- iOS设备下添加button的按下效果
在触屏上, button的按下效果用:active触发, 但是我发现iOS设备上:active效果并没有生效. :active pseudo-class doesn't work in mobile ...
- 关于PowerBuilder 9.0中如何修改项目工程名字
关于PowerBuilder 9.0中如何修改项目工程名字,首先要找到三个文件,xxx.pbl.xxx.pbt.xxx.pbw这三个文件,为何要找这个三号个文件呢? 因为在使用PowerBuilder ...
- 产品设计中先熟练使用铅笔 不要依赖Axure
在互联网产品领域,Axure已成为产品经理.产品设计师以及交互设计师的必备工具,从某种程度讲,Axure帮助我们建立低保真模型,便于与用户的需求验证,也帮助我们构思交互细节,使前端和开发人员更容易理解 ...
- VirtualBox的四种网络连接方式详解
VirtualBox中有4中网络连接方式: 1. NAT 2. Bridged Adapter 3. Internal 4. Host-only Adapter VMWare中有三种,其实他跟VMWa ...
- 如何在多线程中调用winform窗体控件
由于 Windows 窗体控件本质上不是线程安全的.因此如果有两个或多个线程适度操作某一控件的状态(set value),则可能会迫使该控件进入一种不一致的状态.还可能出现其他与线程相关的 bug,包 ...