感觉紫书上这一部分内容基本都需要递归,也算帮自己初步掌握递归思路了吧!第一次独立完成本章的习题!
本题题意很好理解,但是如果只看书的话最后求总黑方块个数的时候会有疑问,最好还是去看看原题。原题是给定了一共有1024个方块,树的层数不超过5。
这里给出解题思路:按顺序依次建立两颗四叉树->合并树->根据层数求黑色方块总数量,代码很容易实现,就是递归的时候自己多走两遍会比较清晰。下面放出代码(均有注释):

#include<bits/stdc++.h>
using namespace std;
struct Tree//四叉树
{char val;Tree *child[4];Tree(){for(int i=0;i<4;i++)child[i]=NULL;}
};
int bn,en,sum;//分别代表开始、结束和黑块个数
Tree *creat(char *tree)//递归建树
{if(bn==en)return NULL;char ch=tree[bn];bn++;Tree *root=new Tree();root->val=ch;if(ch=='p'){for(int i=0;i<4;i++)root->child[i]=creat(tree);}return root;
}
void unionT(Tree * &root1,Tree * &root2)//合并两棵树:这里需要改变指针,所以是对指针的引用;
{if(root1&&root2) {char c1=root1->val;char c2=root2->val;if(c1==c2&&c1=='p')//如果都是中间结点,继续往下执行; {for(int i=0;i<4;i++)unionT(root1->child[i],root2->child[i]);}else if(c1!='p'&&c2=='p') {if(c1=='f')return;else{root1=root2;return;}}else if(c2=='f')//黑色优先级最大; {root1=root2;return;}}
}
void slove(Tree *root,int level)//一共就只有1024个方块,判断层数就很容易能算出黑色结点个数;
{if(root){if(root->val=='p'){for(int i=0;i<4;i++)slove(root->child[i],level+1);}else if(root->val=='f'){sum+=1024/(pow(4,level-1));}}
}
int main()
{int T;cin>>T;while(T--){sum=0;char tree1[2001];char tree2[2001];cin>>tree1;cin>>tree2;bn=0,en=strlen(tree1);Tree *root1=creat(tree1);bn=0,en=strlen(tree2);Tree *root2=creat(tree2);unionT(root1,root2);slove(root1,1);cout<<"There are "<<sum<<" black pixels."<<endl;}return 0;
}

紫书刷题记录 UVa297 四分树相关推荐

  1. PAT甲级刷题记录-(AcWing)-(Day06树 8题)

    PAT甲级刷题记录-(AcWing)-(Day06树 8题) 课程来源AcWing 其中AcWing中的题目为翻译好的中文题目 今日刷题列表 1110 Complete Binary Tree 111 ...

  2. bzoj3032 七夕祭(蓝书刷题记录)

    引入:经典贪心问题 均分纸牌 有 N 堆纸牌,编号分别为 1,2,-, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动.移牌规则为:在编号为 1 堆上取的纸牌,只 ...

  3. To the MAX(蓝书刷题记录)

    问题描述:给定一个 n*n 的矩阵,求最大子矩阵. 引发一个专题: 求最大子矩阵的方法. 方法一:最朴素的算法可以是枚举两个端点,在对其求和.复杂度O(n^6) hloj 1935护林员盖房子 方法二 ...

  4. CSP-S集训刷题记录

    $ CSP.S $ 集训刷题记录: $ By~wcwcwch $ 一.字符串专题: 1. [模板]$ manacher $ 算法 模型: 求出字符串 $ S $ 中所有回文串的位置及长度. $ sol ...

  5. 非二叉树 UVA297 四分树 Quadtrees

    UVA297 四分树 Quadtrees 题意翻译 如图所示,可以用四分图来表示一个黑白图像,方法是用根节点表示整幅图像,然后把行列个分成两等份,按图中的方式编号,从左到右对应4个子节点.如果某子节点 ...

  6. 算法笔记CodeUp第一至第六章刷题记录

    文章目录 <算法笔记>2.2小节--C/C++快速入门->顺序结构 1.例题1-1-1 按要求输出信息(1) 2.例题1-1-2 按要求输出信息(2) 3.例题1-2-1 求两个整数 ...

  7. LeetCode刷题记录15——21. Merge Two Sorted Lists(easy)

    LeetCode刷题记录15--21. Merge Two Sorted Lists(easy) 目录 LeetCode刷题记录15--21. Merge Two Sorted Lists(easy) ...

  8. $2019$ 暑期刷题记录 $2$(基本算法专题)

    $ 2019 $ 暑期刷题记录 $ 2 $ (基本算法专题) $ by~~wch $ $ BZOJ~1958~Strange~Towers~of~Hanoi $ (动态规划,递推) 题目大意: 求有 ...

  9. Codeforces 刷题记录(已停更)

    Codeforces 每日刷题记录 (已停更) 打'+'是一些有启发意义的题目,部分附上一句话题解,每日更新3题,大部分题目较水. Day ID Problem Tutorial Note 1 1 + ...

  10. BZOJ刷题记录---提高组难度

    BZOJ刷题记录---提高组难度 总目录详见https://blog.csdn.net/mrcrack/article/details/90228694 序号 题号 算法 思想难度 实现难度 总难度 ...

最新文章

  1. 我用24小时、8块GPU、400美元在云上完成训练BERT!特拉维夫大学新研究
  2. 什么是C语言中的隐式函数声明?
  3. 人的幸福感取决于什么
  4. java正则表达式非贪婪_正则表达式中的贪婪与非贪婪匹配模式
  5. python缩进来分组语句_Python中的语句,缩进和注释
  6. selenium+python,解决selenium弹出新页面,无法定位元素的问题(报错:Unable to locate element:元素)
  7. CURL基于某个URL请求需要身份验证
  8. Android底层开发实战PDF
  9. 窘境遇到HR Manager
  10. java中求数组中最大值
  11. 怎么下载b站的弹幕(danmuku)
  12. ADP(自适应动态规划)-HDP
  13. 从自动驾驶新趋势看普及前景
  14. [6] 支付漏洞( 0 元购 )
  15. 毕业论文写作中致谢词的常见写法及优秀范文
  16. 微软亚太研发集团2013招聘
  17. 继承----有关虚函数和虚拟继承
  18. 鲁大师5月新机性能榜:红魔6R夺冠,“特供版”新机密集
  19. Easy EDA #学习笔记06# | L9110S H桥2路直流电机驱动板设计(附.4056 充电、过充过放保护电路设计)
  20. Android内核开发 Goldfish Linux Kernel编译及安卓虚拟机测试

热门文章

  1. a指定许可服务器无效,错误的hostid与许可证服务器
  2. 信息安全快讯丨桃李满天下,金秋谢师恩——教师节快乐!
  3. linux文件系统添加pcm,Linux音频驱动之三:PCM设备的创建
  4. TARA(威胁分析和风险评估方法)
  5. SageMath | Crypto Tool
  6. 蚂蚁金服实习生4.16面试
  7. umts是移动还是联通_手机网络类型CDMA、GSM、WCDMA是什么意思?
  8. 加班又如何,我要薅资本家羊毛《打工人的那些事》
  9. 基于Python的指数基金量化投资-通过市盈率和市净率对指数估值
  10. poi 3.17合并单元格报错 java.lang.IllegalArgumentException: Merged region A1 must contain 2 or more cells