题意:

一个四叉树用来格式编码图像,这个想法的基础是任意的图像能够分成四个象限.每个象限能够拆分成四个子象限,
比如,在四叉树中,每一个图像都被一个父节点表示,根据预先定义好的顺序,四个孩子节点代表四个象限.

当然,如果整个图像只有一个颜色,这个图像的四叉树形式只有一个节点.通常,如果一个象限由不同的颜色组成,这个象限需要再次被拆分,
因此,四叉树不必有均匀的深度.
现代电脑图像工作基础是32x32单元格的黑白图,所以一个图像有1024个像素点.为了形成一个新的图像,一个操作是把俩个图像加在一起。
如果俩个像素点中有一个是黑色,那么相加后的像素点是黑色,要不然就是白色.

This particular artist believes in what he calls the preferred fullness:
为了让一个图像变得有趣(比如卖更多的钱)的最重要的属性是被填满黑色像素点的数目.
所以在让俩个图像相加前,他想知道在相加后的图像中有多少个黑色的像素点.
你的任务是写一个程序,给一颗代表俩个图形的四叉树,计算相加后结果图像中黑色的像素点的数目,

比如下面的计算,第一个样例从上到下展示了一个图像,四叉树,先序遍历字符串形式,像素点数目,
象限编号在最上方显示。
————
| 2|1 |
| 3|4 |
————
图形
四叉树形式
字符串形式
四个象限总共1024个点,比如第一象限占的点数是1024/4=256,样例中一个最小黑方块占的点数是256/4=64

输入:
第一行包含测试用例总数(N)
每一组测试用例包含俩个字符串,每个字符串一行,字符串是四叉树的先序遍历结果
字符p代表父节点,f代表象限全是黑色,e代表全是白色,保证每个字符串的是合法的四叉树,
树的深度不会超过5(因为这样像素的只有一个颜色)
1024
/
256
/
64
/
16
/
4
/
1

  1. #include<stdio.h>
  2. #include<iostream>
  3. #include <strstream>
  4. #include<memory.h>
  5. using namespace std;
  6.  
  7. const int MAX = (1 << 0) + (1 << 2) + (1 << 4) + (1 << 6) + (1 << 8)
  8. + (1 << 10);
  9. void buildTree(char* a, string str, int index, int* sIndex);
  10. void addTree(const char* t1, const char* t2, int* total, int depth, int index);
  11. int main()
  12. {
  13. freopen("d:\\1.txt", "r", stdin);
  14. int N;
  15. cin >> N;
  16. string str = "There are %d black pixels.\n";
  17. while (N--)
  18. {
  19. char t1[MAX];
  20. char t2[MAX];
  21. memset(t1, 0, MAX);
  22. memset(t2, 0, MAX);
  23. string str1, str2;
  24. cin >> str1;
  25. cin >> str2;
  26. char c = str1.at(0);
  27. t1[0] = c;
  28. if(c == 'p')
  29. {
  30. int i = 0;
  31. buildTree(t1, str1, 0, &i);
  32. }
  33. c = str2.at(0);
  34. t2[0] = c;
  35. if(c == 'p')
  36. {
  37. int i = 0;
  38. buildTree(t2, str2, 0, &i);
  39. }
  40. int total = 0;
  41. addTree(t1, t2, &total, 0, 0);
  42. printf(str.c_str(), total);
  43. }
  44. }
  45.  
  46. void buildTree(char* a, string str, int index, int* sIndex)
  47. {
  48. char c;
  49. for(int i = 1; i <= 4; i++)
  50. {
  51. *sIndex = *sIndex + 1;
  52. c = str.at(*sIndex);
  53. a[index * 4 + i] = c;
  54. if(c == 'p')
  55. {
  56. buildTree(a, str, index * 4 + i, sIndex);
  57. }
  58. }
  59. }
  60.  
  61. void addTree(const char* t1, const char* t2, int* total, int depth, int index)
  62. {
  63. if(t1[index] == 'f' || t2[index] == 'f')
  64. {
  65. *total = *total + (1 << ((5-depth)*2));
  66. return;
  67. }
  68. else if(t1[index] == 'p' || t2[index] == 'p')
  69. {
  70. addTree(t1, t2, total, depth + 1, index * 4 + 1);
  71. addTree(t1, t2, total, depth + 1, index * 4 + 2);
  72. addTree(t1, t2, total, depth + 1, index * 4 + 3);
  73. addTree(t1, t2, total, depth + 1, index * 4 + 4);
  74. }
  75.  
  76. }

  

  

uva297的更多相关文章

  1. 树--四分树(UVa297)

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

  2. UVa297 Quadtrees

    // UVa297 Quadtrees // 题意:给两棵四分树的先序遍历,求二者合并之后(黑色部分合并)黑色像素的个数.p表示中间结点,f表示黑色(full),e表示白色(empty) // 算法: ...

  3. UVA297 四分树 Quadtrees 题解

    题目链接: https://www.luogu.org/problemnew/show/UVA297 附几道推荐题目(先完成再食用此题效果更佳) https://www.luogu.org/probl ...

  4. uva297(quadtree)

    给我们两棵quadtree的前序遍历,要我吗求原来32*32的矩阵有多少个位置是黑的 quardtree是将区域划分为相等的4个子空间,然后再递归划分这4个子空间,知道满足条件后终止划分 这题的终止条 ...

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

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

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

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

  7. UVA297:Quadtrees(四分树)

    题目描述 四象树是每个内结点均有4个子结点的特殊四叉树,它可用于描述平面上黑白图像.平面上的黑白图像是32行×32列的正方形,每个格子称为1个象素,是最小的图像单位.正方形图像可分成四个相等的小正方形 ...

  8. 【例题 6-11 UVA-297】Quadtrees

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 发现根本不用存节点信息. 遇到了叶子节点且为黑色,就直接覆盖矩阵就好(因为是并集); [代码] #include <bits/ ...

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

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

随机推荐

  1. shell 命令学习

    https://blog.csdn.net/mnmlist/article/details/55215158

  2. windows下配置redis

    1.首先去GitHub上下载所需文件,这里我们下载的是zip文件 https://github.com/MicrosoftArchive/redis/releases 2.解压后文件目录如下 3.启动 ...

  3. 使用blessed 开发丰富的cli 应用

    blessed 是一个不错的npm 包,可以帮助我们开发出带有丰富ui界面的cli 应用,类似的有subzero 测试环境准备 项目结构 ├── README.md ├── app.js ├── my ...

  4. 转 DataTorrent 1.0每秒处理超过10亿个实时事件

    DataTorrent是一个实时的流式处理和分析平台,它每秒可以处理超过10亿个实时事件. 与Twitter平均每秒大约6000条微博相比,最近发布的DataTorrent 1.0似乎已经超出了需求, ...

  5. Understanding Safari Reader

    Interesting enough to find out the Reader function in Safari is actually Javascript and there are ma ...

  6. php 的交互命令行

    php 的交互命令行 使用过 python 都知道 python 可以使用交互命令. 如下图: 但是 执行 php 显示这个是什么鬼? 按回车和加分号都没用,这是什么原因? 其实是因为使用 php 交 ...

  7. jp@gc - Stepping Thread Group 字段说明

    1.   安装好插件 参考文档“扩展Jmeter插件获取更多监听器” 2.   添加线程组 右键测试计划->添加->Threads(Users)->jp@gc - Stepping ...

  8. 洛谷4059找爸爸(Code+第一次月赛)

    题目:https://www.luogu.org/problemnew/show/P4059 dp. 1.看出-A-B(k-1)可以理解成连续空格的第一个 -A,其余 -B: 2.把会干扰的“上一步右 ...

  9. dubbo实战

    http://blog.csdn.net/hejingyuan6/article/details/47403299

  10. JZ2440 裸机驱动 第11章 通用异步收发器UART

    本章目标: 了解UART原理: 掌握S3C2410/S3C2440中UART的使用 11.1 UART原理及UART内部使用方法 11.1.1 UART原理说明     UART用于传输串行数据:   ...