题目描述

四象树是每个内结点均有4个子结点的特殊四叉树,它可用于描述平面上黑白图像。平面上的黑白图像是32行×32列的正方形,每个格子称为1个象素,是最小的图像单位。正方形图像可分成四个相等的小正方形,可按直角坐标系四个象限的顺序分别编号1,2,3,4,分别对应于四象树的四个子结点。这样,32行×32列的图像就对应于一棵深度为6的完全四叉树,最底层的每个叶结点正好对应于一个象素。但我们可以压缩四象树的结点数量。

当图像上某个区域为全白或者全黑时,可把该区域在四象树上对应的结点描述为全白(用小写字母e表示)或者全黑(用小写字母f表示),并且对这样的结点不再扩展子结点,因为再扩展出的子树上每个结点都是相同的颜色。

只有当图像上某个区域为“杂色”时,才继续划分成四个子区域(在四象树上对应的结点用小写字母p表示),然后“纯”色的子区域也不再扩展,并继续扩展“杂”色子区域。例如,下图左、中两个图像可分别用它们下边的四象树描述。

我们感兴趣的问题是:当两个大小均为32*32的黑白图像叠加后,合成的新图像是什么样子。合成的规则是:当一个图像上某个区域为全黑时,新图像的这个区域即为全黑;当一个图像上某个区域为全白时,新图像的这个区域的颜色是另加一个图像上这个区域的颜色。上图准确地示例了本合成的规则。

我们给出两个图像对应四象树的先序遍历顺序,求合成后的图像中,黑色象素点的数量。

输入

多组测试数据,第1行一个整数T,表示测试数据的组数,每组数据的格式为:

第1行:一个字符串,描述第1棵四象树的先序序列

第2行:一个字符串,描述第2棵四旬树的先序序列

输出

对每组数据,在单独一行上输出一个整数,表示合成后的图像上黑色象素的数量,格式如输出样例所示:

样例输入

  1. 3
    ppeeefpffeefe
  2. pefepeefe
  3. peeef
  4. peefe
  5. peeef
  6. peepefefe

样例输出

  1. There are 640 black pixels.
  2. There are 512 black pixels.
  3. There are 384 black pixels.

我直接把BZOJ的翻译粘过来了(逃

思路1:数据量很小。我第一次写时直接模拟了两棵四叉树的建树与搜索,然后捎带着把最后的黑色个数算出来了。其中黑色结点的值跟它的深度有关,写一写就能找到规律。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <cmath>
  5. using namespace std;
  6.  
  7. struct node
  8. {
  9. char c;
  10. node *ptr[];
  11. node(){for (int i = ; i < ; i++) ptr[i] = NULL;}
  12. };
  13.  
  14. node *root1, *root2;
  15.  
  16. int sum, cnt;//sum是最终结果,cnt是记录字符串走到哪个位置了
  17.  
  18. void release(node *root)//释放
  19. {
  20. if (!root) return;
  21. for (int i = ; i < ; i++)
  22. release(root->ptr[i]);
  23. delete root;
  24. }
  25.  
  26. void build(string cur, node *&root)//建树,记得root要加地址符
  27. {
  28. root = new node();
  29. root->c = cur[cnt++];
  30. if (root->c == 'p')
  31. for (int i = ; i < ; ++i)
  32. {
  33. root->ptr[i] = new node();
  34. build(cur, root->ptr[i]);
  35. }
  36. }
  37.  
  38. void dfs(node *root1, node *root2, int depth)
  39. {
  40. //大概分了三种情况讨论
  41. if (root1->c == 'f' || root2->c == 'f')//有一个是黑
  42. {
  43. sum += pow(,-depth);//数学可推……
  44. return;
  45. }
  46. else if (root1->c == 'e' && root2->c == 'e')//全是白
  47. return;
  48. //对于'p'的点深搜
  49. bool flag1 = root1->c=='p', flag2 = root2->c=='p';
  50. node *x = root1, *y = root2;
  51. for (int i = ; i < ; i++)
  52. {
  53. if (flag1) x = root1->ptr[i];
  54. if (flag2) y = root2->ptr[i];
  55. dfs(x, y, depth+);
  56. }
  57. }
  58.  
  59. int main()
  60. {
  61. int test;
  62. scanf("%d", &test);
  63.  
  64. while (test--)
  65. {
  66. sum = ;
  67. string s,t;
  68. cin >> s >> t;
  69. cnt = , build(s, root1);
  70. cnt = , build(t, root2);
  71.  
  72. dfs(root1, root2, );
  73.  
  74. printf("There are %d black pixels.\n", sum);
  75.  
  76. release(root1),release(root2);
  77. }
  78.  
  79. return ;
  80. }

思路2:书上代码思路是在32*32的正方形里面涂色然后查找,貌似跟树也没什么关系了……书中的注释已经很明白了,见代码。(PS:UVA有毒)

  1. #include <cstdio>
  2. #include <cstring>
  3.  
  4. const int len = ;
  5. const int maxn = + ;
  6. //下面这个char数组和int变量定义顺序变一下UVA居然会WA啊!
  7. //我从未见过如此厚颜无耻之OJ
  8. char s[maxn];
  9. int buf[len][len], cnt;
  10.  
  11. //把字符串s[p..]导出到以(r,c)为左上角,边长为w的缓冲区中
  12. //2 1
  13. //3 4
  14. void draw(const char* s, int& p, int r, int c, int w)
  15. {
  16. char ch = s[p++];
  17. if (ch == 'p')
  18. {
  19. draw(s, p, r , c+w/, w/);//
  20. draw(s, p, r , c , w/);//
  21. draw(s, p, r+w/, c , w/);//
  22. draw(s, p, r+w/, c+w/, w/);//
  23. }
  24. else if (ch == 'f')
  25. for (int i = r; i < r+w; i++)
  26. for (int j = c; j < c+w; j++)
  27. if (buf[i][j] == )
  28. buf[i][j] = ,cnt++;
  29. }
  30.  
  31. int main()
  32. {
  33. int t;
  34. scanf("%d", &t);
  35.  
  36. while (t--)
  37. {
  38. memset(buf, , sizeof(buf));
  39. cnt = ;
  40. for (int i = ; i < ; i++)
  41. {
  42. scanf("%s",s);
  43. int p = ;
  44. draw(s, p, , , len);
  45. }
  46.  
  47. printf("There are %d black pixels.\n", cnt);
  48.  
  49. }
  50.  
  51. return ;
  52. }

UVA297:Quadtrees(四分树)的更多相关文章

  1. UVA.297 Quadtrees (四分树 DFS)

    UVA.297 Quadtrees (四分树 DFS) 题意分析 将一个正方形像素分成4个小的正方形,接着根据字符序列来判断是否继续分成小的正方形表示像素块.字符表示规则是: p表示这个像素块继续分解 ...

  2. 6_11 四分树(UVa297)<四分树>

    一幅图有1024个点, 可以对图平均分成4块, 并且子图也可以再往下分, 直到一个子图表示一个点. f表示这块子图填满, p表示它还有4个子图, e表示没有子图(当然啦, 它也没有填满). 给定两个字 ...

  3. uva297 Quadtrees (线段树思想,区间操作)

    借鉴了线段数区间操作的思想,只是把一个结点的孩子扩展到了4个, 结点k,四个孩子编号分别为4*k+1,4*k+2,4*k+3,4*K+4,从零开始. 根据层数,确定权值. #include<cs ...

  4. UVa 297 Quadtrees(树的递归)

    Quadtrees 四分树就是一颗一个结点只有4个儿子或者没有儿子的树 [题目链接]UVa 297 Quadtrees [题目类型]树的递归 &题意: 一个图片,像素是32*32,给你两个先序 ...

  5. Uva297 Quadtrees【递归建四分树】【例题6-11】

    白书 例题6-11 用四分树来表示一个黑白图像:最大的图为根,然后按照图中的方式编号,从左到右对应4个子结点.如果某子结点对应的区域全黑或者全白,则直接用一个黑结点或者白结点表示:如果既有黑又有白,则 ...

  6. [C++]四分树(Quadtrees)

    [本博文非博主原创,思路与题目均摘自 刘汝佳<算法竞赛与入门经典(第2版)>] 四分树Quadtrees 一幅图有1024个点, 可以对图平均分成4块, 并且子图也可以再往下分, 直到一个 ...

  7. 四分树 (Quadtrees UVA - 297)

    题目描述: 原题:https://vjudge.net/problem/UVA-297 题目思路: 1.依旧是一波DFS建树 //矩阵实现 2.建树过程用1.0来填充表示像素 #include < ...

  8. 树--四分树(UVa297)

    郑重声明: 数据结构这部分内容, 由于博主才学很少(且很浅)的内容, 所以现在所写的(大都是抄的)一些典型例题, 再加上一些自己想法和理解而已, 等博主勤加修炼, 以后会大有补充和改进. 粗浅之处, ...

  9. UVa 297 (四分树 递归) Quadtrees

    题意: 有一个32×32像素的黑白图片,用四分树来表示.树的四个节点从左到右分别对应右上.左上.左下.右下的四个小正方区域.然后用递归的形式给出一个字符串代表一个图像,f(full)代表该节点是黑色的 ...

  10. UVA - 297 Quadtrees (四分树)

    题意:求两棵四分树合并之后黑色像素的个数. 分析:边建树边统计. #include<cstdio> #include<cstring> #include<cstdlib& ...

随机推荐

  1. Vue中的methods、watch、computed

    看到这个标题就知道这篇文章接下来要讲的内容,我们在使用vue的时候methods.watch.computed这三个特性一定经常使用,因为它们是非常的有用,但是没有彻底的理解它们的区别和各自的使用场景 ...

  2. Linux - Unix环境高级编程(第三版) 源代码编译(即头文件apue.h如何使用问题)【转】

    本文转载自:http://blog.csdn.net/hadas_wang/article/details/43203795 1. 下载代码:http://www.apuebook.com/code3 ...

  3. 电脑设备对于IT人员,犹如武器对于士兵

    本人做了多年Softwarer,写些感受. 比我们早的老一代程序员更是用自己的健康总结了一些经验. 先说关于健康方面: 程序员要长期坐着,这对健康损害很大,颈椎腰椎,心肺能力都会衰减.以前只是听说,自 ...

  4. rc.local 开启自启动,检测是否成功

    rc.local /etc/init.d/nginx start 查看运行状态 systemctl status rc-local ● rc-local.service - /etc/rc.local ...

  5. 脚踏实地学C#5-扩展方法

    扩展方法(Extension Method) MSDN定义:能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法须知: 1.扩展方法声明所在的类必须被声明为 ...

  6. the art of seo(chapter five)

    Keyword Research ***The Theory Behind Keyword Research***1.When users go to search engines and type ...

  7. poj分类解题报告索引

    图论 图论解题报告索引 DFS poj1321 - 棋盘问题 poj1416 - Shredding Company poj2676 - Sudoku poj2488 - A Knight's Jou ...

  8. H3C-端口镜像

    本地端口镜像配置举例 配置Switch: <Sysname> system-view [Sysname] mirroring-group 1 local # 创建本地镜像组 [Sysnam ...

  9. 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 ...

  10. 光流 LK 金字塔

    文章转载自:https://blog.csdn.net/sgfmby1994/article/details/68489944 光流是图像亮度的运动信息描述,这种运动模式指的是由一个观察者(比如摄像头 ...