题目链接:
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.
分析:
题目就是分别给出关于两幅图在四叉树数据结构中的表示的按照前序遍历得到的序列, 然后要求我们求出合并后的图像的黑色像素有多少个。
其中,p代表是一个父节点(parent),f表示表示该节点是黑色的(full), e 表示该节点是白色的(empty).
我的方法是,首先, 需要按照所给的序列构造出两幅图的四叉树,可以通过递归的方法进行构造,和构造二叉树十分像。
然后,就是对两棵树进行计算的过程。具体是下面的代码
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char str1[100005], str2[100005];
class Node{
public:
char data;
Node *son[4];
};
Node node[20000];
int nIndex, pos1,pos2, sum;
inline Node* NewNode(){
node[nIndex].data = 0;
for(int i=0; i<4; ++i) node[nIndex].son[i] = NULL;
return &node[nIndex++];
}
// 通过序列建树
Node *BuildTree(Node* root, int &pos, char *str){
++pos;
if( pos==strlen(str) ) return NULL;
root = NewNode();
root->data=str[pos];
if(str[pos]=='p') {
for(int i=0; i<4; ++i){
if(root->son[i]==NULL){
root->son[i] = BuildTree(root->son[i], pos, str);
}
}
}
return root;
}
// 用深搜遍历两棵树求出合并后的黑色像素个数
void dfs(Node *root1, Node *root2, int level){
if(!root1 && !root2) return ;
if(!root1){
if(root2->data=='f'){
sum += 1024>>(level*2);
return;
}
for(int i=0; i<4; ++i)
dfs(root1, root2->son[i], level+1);
return;
}
if(!root2){
if(root1->data=='f'){
sum += 1024>>(level*2);
return;
}
for(int i=0; i<4; ++i)
dfs(root1->son[i],root2, level+1);
return;
}
if(root1->data=='f' || root2->data=='f'){
sum += 1024>>(level*2);
return ;
}
for(int i=0; i<4; ++i)
dfs(root1->son[i], root2->son[i], level+1);
}
void output(Node *root){
if(root){
printf("%c",root->data);
for(int i=0; i<4; ++i)
output(root->son[i]);
}
}
void Solve(){
Node *root1=NULL, *root2=NULL;
pos1=-1, pos2=-1;
nIndex=0;
root1 = BuildTree(root1,pos1, str1);
root2 = BuildTree(root2,pos2, str2);
sum = 0;
dfs(root1, root2 ,0);
printf("There are %d black pixels.\n", sum);
}
int main(){
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
int T;
scanf("%d%*c",&T);
while(T--){
scanf("%s %s", str1,str2);
Solve();
}
return 0;
}
—— 生命的意义,在于赋予它意义。
分享到:
相关推荐
四叉树(Quadtrees)是一种数据结构,它在计算机科学中被广泛应用于二维空间的组织和查询。这种树形结构特别适用于管理大量的点、矩形或其他二维对象,尤其是在游戏开发、图像处理、地图索引等领域。四叉树是二叉树...
正弦信号的matlab代码使用DCT和四叉树进行图像压缩 简介图像压缩:图像压缩可最大程度地减小图形文件的字节大小,而不会降低图像质量到不可接受的水平。 文件大小的减小允许在给定数量的磁盘或内存空间中存储更多...
quadtree-js, 另一个用于javascript的四叉树实现 四叉树 js这是本教程中介绍的Java方法的JavaScript四叉树实现: http://gamedev.tutsplus.com/tutorials/implementation/quick-tip-use-quadtrees-to-
#### 4.30 四叉树(Quadtrees) 四叉树用于图像分割和表示。 #### 4.31 四分法(Quadrisection) 一种将图像分成四个相等部分的方法。 #### 4.32 空间填充曲线(Space-Filling Curves) 空间填充曲线用于图像的...
1. **四叉树(Quadtrees)**:这是一种层次化的数据结构,它将二维空间划分成四个子区域(子块),每个子块可以进一步被划分为四个更小的子块,以此类推。四叉树非常适合用于表示具有连续变化特性的空间数据,如地形...
这类系统在地理信息系统(GIS)、遥感、城市规划、交通管理、环境监测等多个领域有着广泛应用。下面将详细阐述空间数据库系统的概念、设计、实现以及项目管理的相关知识点。 一、空间数据库系统的基本概念 空间...
Flatbush算法的核心在于分层四叉树(Quadtrees)或八叉树(Octrees)的数据结构,这种结构将二维空间划分为多个子区域。每个子区域可以进一步细分为四个或八个更小的子区域,直到所有子区域都能容纳单个元素。通过...
4. 空间索引:为了提高数据检索速度,通常会使用空间索引技术,如R-树、Quadtrees或B树等。源码中可能包含了构建和查询这些索引的算法。 5. 地理投影:由于地球是一个曲面,地图必须进行投影才能在平面上展示。源码...
- 空间索引如R树、四叉树或Quadtrees,优化了对空间数据的搜索性能,使得查找特定区域内的对象变得更加高效。 4. **动态插入、删除和修改**: - 动态操作意味着用户可以在运行时添加新的空间对象,删除不再需要的...
《Pygeos库在Python中的应用与安装指南》 Pygeos是一款强大的Python库,它提供了高效的几何操作,尤其在处理大规模地理空间数据时表现突出。Pygeos是基于GEOS(Geometry Engine Open Source)库的,而GEOS是开源的...
这种树形结构将空间划分为四个子区域(或四象限),并根据对象的位置将其存储在相应的子树中。在传统Quadtrees中,每个节点仅包含位置信息,但根据提供的描述,这里的实现增加了一个新的维度,即文本信息,使得它...
聚类分析是一种无监督机器学习方法,主要用于对数据集中的对象进行分类,其核心思想是“物以类聚”,即将相似的对象聚集在一起形成不同的簇。由于这种方法不需要预先设定分类标准,因此在面对大量数据时,尤其在缺乏...
【基于MATLAB三维数字地形图在库区冲淤分析中的应用】 MATLAB是一款强大的数学计算和数据可视化软件,常用于科学研究和工程应用。在库区冲淤分析中,利用MATLAB构建三维数字地形图能够直观地展示水库地形变化,帮助...
四叉树 如何使用您可以下载quadtree.js并将其包含在您的p5草图中,或通过以下CDN链接进行引用: < script src =" https://cdn.jsdelivr.net/gh/CodingTrain/QuadTree/quadtree.js " > </ script > 一旦...
4. 空间索引:为了提高查询效率,需要建立空间索引,如R树、四叉树、Quadtrees等。 5. 拓扑规则:定义空间对象间的拓扑关系,如相邻、包含、相交等。 四、GIS开发中的关键技术和工具 1. GIS软件:如ArcGIS、QGIS等...
在处理混合类型的数据时,可能需要对数据进行预处理,如标准化或编码,以便在不同类型的属性之间进行比较。 聚类分析方法主要包括以下几种: 1. **分类划分方法**,如K均值(K-means)、K中心点(K-modes)等,...
- **空间索引**:加快空间查询速度的特殊数据结构,如R树、Quadtrees等。 - **地理编码**:将地址转换为坐标的过程。 - **空间分析**:包括缓冲区分析、网络分析、叠加分析等,用于解决空间问题。 4. **数据库...
4. **空间索引**:为了提高查询效率,地图数据通常会建立空间索引,如R-树或Quadtrees。这使得在大量地理对象中快速定位和比较目标变得可能。 5. **用户界面**:利用Visual Studio 2008,开发者可以创建直观的用户...
计算机图形学是计算机科学的一个重要分支,主要研究如何在屏幕上生成和显示图像。"高级计算机图形学重点.pdf"这份文档可能涵盖了高级图形学中的关键概念和技术。以下是对这些概念的详细解释: 1. **坐标变换**:在...
- **空间索引**:Oracle Spatial使用高效的R树或Quadtrees索引来快速查询和操作大量空间数据。 - **查询和分析**:支持复杂的空间查询,如缓冲区查询、邻近查询、覆盖查询等,并提供空间分析工具,如距离计算、...