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. 图像超分辨率与天气预报
  2. 第二章 -- (第一单元) -- 自动安装虚拟机
  3. 在XML中发送二进制数据
  4. iOS程序健壮性笔记
  5. 高级SQL优化(三) 常用优化工具 ——《12年资深DBA教你Oracle开发与优化——性能优化部分》...
  6. Python超详细的字符串用法大全
  7. Storm任务提交过程及目录树介绍
  8. Shell编程之通配符
  9. c语言程序设计操作,c语言编程入门相关详细操作
  10. system/build.prop参数说明
  11. 爬取豆瓣的战狼影评(cookies 云词)
  12. 电脑远程连接打印机打印
  13. 深度学习基本算法介绍
  14. 使用wireshark检测RTP丢包问题
  15. 亚马逊美国买家账号怎么注册
  16. 我感觉的优美诗句品鉴(不定时更新)
  17. 币安智能链监听日志事件
  18. Contention
  19. 原神ios android,原神安卓和ios数据互通吗 原神ios和安卓能一起玩吗
  20. 赏红叶,是金秋心旷神怡之事

热门文章

  1. DEF、LEF 文件
  2. 安卓子系统(WSA)2301.40000.4.0发布
  3. 介绍几款网页翻译插件
  4. TP5框架实现两表联查
  5. GWAS 分析Fst画图
  6. 虚拟机-CentOS7创建共享文件夹
  7. 写的另一款安全期避孕计算软件 (ISEX安全期计算) 强力推荐!
  8. php中取整的函数,PHP取整函数的具体使用方法介绍_PHP教程
  9. Linux查看虚拟网卡的命令,Linux之网络管理(2)虚拟网卡
  10. Swfit4中Codable解析Any类型的问题(Type 'XX' does not conform to protocol 'Decodable')