297 - Quadtrees 4898
41.55%
1811
90.39%

题目链接:

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

——      生命的意义,在于赋予它意义。 

                   原创 http://blog.csdn.net/shuangde800 , By   D_Double

UVa 297 - Quadtrees 四叉树, 及其在编码图像的应用相关推荐

  1. UVa 297 - Quadtrees

    题目:利用四叉树处理图片,给你两张黑白图片的四叉树,问两张图片叠加后黑色的面积. 分析:搜索.数据结构.把图片分成1024块1*1的小正方形,建立一位数组记录对应小正方形的颜色. 利用递归根据字符串, ...

  2. UVA 297 Quadtrees

    UVA_297 由于这个题目可以看成是完全四叉树,所以借用了一下线段树的思想,把题目转化成了对区间进行两次染色,然后求最后色块的个数. 当然我的程序写得复杂了,lazy可以不用的,在统计的时候遇到黑色 ...

  3. 【两种解法】Quadtrees UVA - 297(隐式建树+显式建树)

    立志用最少的代码做最高效的表达 A quadtree is a representation format used to encode images. The fundamental idea be ...

  4. Quadtrees UVA - 297

    题目链接:https://vjudge.net/problem/UVA-297 题目大意:如上图所示,可以用一个四分树来表示一个黑白图像,方法是用根节点表示整副图像,然后把行列各等分两等分,按照图中的 ...

  5. 297 - Quadtrees

    2019独角兽企业重金招聘Python工程师标准>>> 题意: 1. 两张 32*32 像素的图像进行叠加, 像素只有黑白两种颜色, 按以下规则叠加: (1). 黑+黑=黑; (2) ...

  6. UVa 297 四分树

    感觉特别像那个分治的日程表问题.是f的话就填,否则就不填,然后同一个表填两次.那么就是最后的结果. 1 #include <iostream> 2 #include <cstring ...

  7. 【图像处理】小波编码图像中伪影和纹理的检测附Matlab代码和报告

    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.

  8. 【图像处理】小波编码图像中伪影和纹理的检测(Matlab代码实现)

  9. 紫书《算法竞赛入门经典》

    紫书<算法竞赛入门经典>题目一览 第3章 数组和字符串(例题) UVA 272 TEX Quotes UVA 10082 WERTYU UVA 401 Palindromes UVA 34 ...

最新文章

  1. Elasticsearch使用优化之拙见
  2. Android网络服务发现(NSD)协议的使用
  3. swift 项目_如何对iOS项目进行静态分析
  4. 12.20今日头条实习面试总结-算法工程师
  5. 32张图带你彻底搞懂事务和锁!
  6. Java数学工具类MathUtil
  7. 【netty】netty HashedWheelTimer 延时队列
  8. python 函数嵌套 报错_《Python》 函数嵌套、闭包和迭代器
  9. 计算机技术中,下列的英文缩写和中文名字的对照中,正确的是,计算机技术中,下列的英文缩写和中文名字的对照中。正确的是(  )。 a.cad——计算机辅助制造b.cam——计...
  10. idea中怎么新建vue项目_项目中使用vue-awesome-swiper
  11. Hadoop权威指南学习笔记一
  12. 大型网站架构的演化[转]
  13. 电脑共享打印机拒绝访问要怎么办
  14. 《推荐系统》基于标签的用户推荐系统
  15. 程序员来聊一聊信用卡(二)——对信用卡的一些基本认识
  16. mac更新系统后xcode-select --install使用问题
  17. gcc 编译选项常用参数(-S -c -E -o)
  18. 计算机毕业设计之家庭理财管理系统的设计与实现
  19. 微信小程序之Github API用户登录认证的三种方式
  20. 2020年下半年软件设计师下午真题试题(案例分析)及答案

热门文章

  1. 单元测试打桩,通俗易懂解释。
  2. 旅通软件是旅行社现代化发展的领路人
  3. Mobox企业网盘支持对象存储帮助用户推进私有云
  4. 使用宝塔搭建个人博客
  5. go语言服务器实战,Go实战--golang实现MP4视频文件服务器(nareix/joy4)
  6. TP5 框架 防止 sql注入 + xss攻击 + session盗窃
  7. 什么是抽象数据类型?
  8. phpcms v9 php标签,实现phpcms V9标签Tag伪静态
  9. python 字符串类型
  10. 第五人格显示没有服务器怎么办,第五人格 查看自己服务器 | 手游网游页游攻略大全...