UVA297:Quadtrees(四分树)
题目描述
四象树是每个内结点均有4个子结点的特殊四叉树,它可用于描述平面上黑白图像。平面上的黑白图像是32行×32列的正方形,每个格子称为1个象素,是最小的图像单位。正方形图像可分成四个相等的小正方形,可按直角坐标系四个象限的顺序分别编号1,2,3,4,分别对应于四象树的四个子结点。这样,32行×32列的图像就对应于一棵深度为6的完全四叉树,最底层的每个叶结点正好对应于一个象素。但我们可以压缩四象树的结点数量。
当图像上某个区域为全白或者全黑时,可把该区域在四象树上对应的结点描述为全白(用小写字母e表示)或者全黑(用小写字母f表示),并且对这样的结点不再扩展子结点,因为再扩展出的子树上每个结点都是相同的颜色。
只有当图像上某个区域为“杂色”时,才继续划分成四个子区域(在四象树上对应的结点用小写字母p表示),然后“纯”色的子区域也不再扩展,并继续扩展“杂”色子区域。例如,下图左、中两个图像可分别用它们下边的四象树描述。
我们感兴趣的问题是:当两个大小均为32*32的黑白图像叠加后,合成的新图像是什么样子。合成的规则是:当一个图像上某个区域为全黑时,新图像的这个区域即为全黑;当一个图像上某个区域为全白时,新图像的这个区域的颜色是另加一个图像上这个区域的颜色。上图准确地示例了本合成的规则。
我们给出两个图像对应四象树的先序遍历顺序,求合成后的图像中,黑色象素点的数量。
输入
多组测试数据,第1行一个整数T,表示测试数据的组数,每组数据的格式为:
第1行:一个字符串,描述第1棵四象树的先序序列
第2行:一个字符串,描述第2棵四旬树的先序序列
输出
对每组数据,在单独一行上输出一个整数,表示合成后的图像上黑色象素的数量,格式如输出样例所示:
样例输入
- 3
ppeeefpffeefe- pefepeefe
- peeef
- peefe
- peeef
- peepefefe
样例输出
- There are 640 black pixels.
- There are 512 black pixels.
- There are 384 black pixels.
我直接把BZOJ的翻译粘过来了(逃
思路1:数据量很小。我第一次写时直接模拟了两棵四叉树的建树与搜索,然后捎带着把最后的黑色个数算出来了。其中黑色结点的值跟它的深度有关,写一写就能找到规律。
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #include <cmath>
- using namespace std;
- struct node
- {
- char c;
- node *ptr[];
- node(){for (int i = ; i < ; i++) ptr[i] = NULL;}
- };
- node *root1, *root2;
- int sum, cnt;//sum是最终结果,cnt是记录字符串走到哪个位置了
- void release(node *root)//释放
- {
- if (!root) return;
- for (int i = ; i < ; i++)
- release(root->ptr[i]);
- delete root;
- }
- void build(string cur, node *&root)//建树,记得root要加地址符
- {
- root = new node();
- root->c = cur[cnt++];
- if (root->c == 'p')
- for (int i = ; i < ; ++i)
- {
- root->ptr[i] = new node();
- build(cur, root->ptr[i]);
- }
- }
- void dfs(node *root1, node *root2, int depth)
- {
- //大概分了三种情况讨论
- if (root1->c == 'f' || root2->c == 'f')//有一个是黑
- {
- sum += pow(,-depth);//数学可推……
- return;
- }
- else if (root1->c == 'e' && root2->c == 'e')//全是白
- return;
- //对于'p'的点深搜
- bool flag1 = root1->c=='p', flag2 = root2->c=='p';
- node *x = root1, *y = root2;
- for (int i = ; i < ; i++)
- {
- if (flag1) x = root1->ptr[i];
- if (flag2) y = root2->ptr[i];
- dfs(x, y, depth+);
- }
- }
- int main()
- {
- int test;
- scanf("%d", &test);
- while (test--)
- {
- sum = ;
- string s,t;
- cin >> s >> t;
- cnt = , build(s, root1);
- cnt = , build(t, root2);
- dfs(root1, root2, );
- printf("There are %d black pixels.\n", sum);
- release(root1),release(root2);
- }
- return ;
- }
思路2:书上代码思路是在32*32的正方形里面涂色然后查找,貌似跟树也没什么关系了……书中的注释已经很明白了,见代码。(PS:UVA有毒)
- #include <cstdio>
- #include <cstring>
- const int len = ;
- const int maxn = + ;
- //下面这个char数组和int变量定义顺序变一下UVA居然会WA啊!
- //我从未见过如此厚颜无耻之OJ
- char s[maxn];
- int buf[len][len], cnt;
- //把字符串s[p..]导出到以(r,c)为左上角,边长为w的缓冲区中
- //2 1
- //3 4
- void draw(const char* s, int& p, int r, int c, int w)
- {
- char ch = s[p++];
- if (ch == 'p')
- {
- draw(s, p, r , c+w/, w/);//
- draw(s, p, r , c , w/);//
- draw(s, p, r+w/, c , w/);//
- draw(s, p, r+w/, c+w/, w/);//
- }
- else if (ch == 'f')
- for (int i = r; i < r+w; i++)
- for (int j = c; j < c+w; j++)
- if (buf[i][j] == )
- buf[i][j] = ,cnt++;
- }
- int main()
- {
- int t;
- scanf("%d", &t);
- while (t--)
- {
- memset(buf, , sizeof(buf));
- cnt = ;
- for (int i = ; i < ; i++)
- {
- scanf("%s",s);
- int p = ;
- draw(s, p, , , len);
- }
- printf("There are %d black pixels.\n", cnt);
- }
- return ;
- }
UVA297:Quadtrees(四分树)的更多相关文章
- UVA.297 Quadtrees (四分树 DFS)
UVA.297 Quadtrees (四分树 DFS) 题意分析 将一个正方形像素分成4个小的正方形,接着根据字符序列来判断是否继续分成小的正方形表示像素块.字符表示规则是: p表示这个像素块继续分解 ...
- 6_11 四分树(UVa297)<四分树>
一幅图有1024个点, 可以对图平均分成4块, 并且子图也可以再往下分, 直到一个子图表示一个点. f表示这块子图填满, p表示它还有4个子图, e表示没有子图(当然啦, 它也没有填满). 给定两个字 ...
- uva297 Quadtrees (线段树思想,区间操作)
借鉴了线段数区间操作的思想,只是把一个结点的孩子扩展到了4个, 结点k,四个孩子编号分别为4*k+1,4*k+2,4*k+3,4*K+4,从零开始. 根据层数,确定权值. #include<cs ...
- UVa 297 Quadtrees(树的递归)
Quadtrees 四分树就是一颗一个结点只有4个儿子或者没有儿子的树 [题目链接]UVa 297 Quadtrees [题目类型]树的递归 &题意: 一个图片,像素是32*32,给你两个先序 ...
- Uva297 Quadtrees【递归建四分树】【例题6-11】
白书 例题6-11 用四分树来表示一个黑白图像:最大的图为根,然后按照图中的方式编号,从左到右对应4个子结点.如果某子结点对应的区域全黑或者全白,则直接用一个黑结点或者白结点表示:如果既有黑又有白,则 ...
- [C++]四分树(Quadtrees)
[本博文非博主原创,思路与题目均摘自 刘汝佳<算法竞赛与入门经典(第2版)>] 四分树Quadtrees 一幅图有1024个点, 可以对图平均分成4块, 并且子图也可以再往下分, 直到一个 ...
- 四分树 (Quadtrees UVA - 297)
题目描述: 原题:https://vjudge.net/problem/UVA-297 题目思路: 1.依旧是一波DFS建树 //矩阵实现 2.建树过程用1.0来填充表示像素 #include < ...
- 树--四分树(UVa297)
郑重声明: 数据结构这部分内容, 由于博主才学很少(且很浅)的内容, 所以现在所写的(大都是抄的)一些典型例题, 再加上一些自己想法和理解而已, 等博主勤加修炼, 以后会大有补充和改进. 粗浅之处, ...
- UVa 297 (四分树 递归) Quadtrees
题意: 有一个32×32像素的黑白图片,用四分树来表示.树的四个节点从左到右分别对应右上.左上.左下.右下的四个小正方区域.然后用递归的形式给出一个字符串代表一个图像,f(full)代表该节点是黑色的 ...
- UVA - 297 Quadtrees (四分树)
题意:求两棵四分树合并之后黑色像素的个数. 分析:边建树边统计. #include<cstdio> #include<cstring> #include<cstdlib& ...
随机推荐
- Vue中的methods、watch、computed
看到这个标题就知道这篇文章接下来要讲的内容,我们在使用vue的时候methods.watch.computed这三个特性一定经常使用,因为它们是非常的有用,但是没有彻底的理解它们的区别和各自的使用场景 ...
- Linux - Unix环境高级编程(第三版) 源代码编译(即头文件apue.h如何使用问题)【转】
本文转载自:http://blog.csdn.net/hadas_wang/article/details/43203795 1. 下载代码:http://www.apuebook.com/code3 ...
- 电脑设备对于IT人员,犹如武器对于士兵
本人做了多年Softwarer,写些感受. 比我们早的老一代程序员更是用自己的健康总结了一些经验. 先说关于健康方面: 程序员要长期坐着,这对健康损害很大,颈椎腰椎,心肺能力都会衰减.以前只是听说,自 ...
- rc.local 开启自启动,检测是否成功
rc.local /etc/init.d/nginx start 查看运行状态 systemctl status rc-local ● rc-local.service - /etc/rc.local ...
- 脚踏实地学C#5-扩展方法
扩展方法(Extension Method) MSDN定义:能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法须知: 1.扩展方法声明所在的类必须被声明为 ...
- the art of seo(chapter five)
Keyword Research ***The Theory Behind Keyword Research***1.When users go to search engines and type ...
- poj分类解题报告索引
图论 图论解题报告索引 DFS poj1321 - 棋盘问题 poj1416 - Shredding Company poj2676 - Sudoku poj2488 - A Knight's Jou ...
- H3C-端口镜像
本地端口镜像配置举例 配置Switch: <Sysname> system-view [Sysname] mirroring-group 1 local # 创建本地镜像组 [Sysnam ...
- dyld: could not load inserted library '/Developer/usr/lib/libBacktraceRecording.dylib' because no suitable image found. Did find:
错误: dyld: could not load inserted library '/Developer/usr/lib/libBacktraceRecording.dylib' because n ...
- 光流 LK 金字塔
文章转载自:https://blog.csdn.net/sgfmby1994/article/details/68489944 光流是图像亮度的运动信息描述,这种运动模式指的是由一个观察者(比如摄像头 ...