当前位置: 首页 > news >正文

UVa 297 Quadtrees

题目分析

本题涉及一种名为四叉树的图像编码格式。四叉树的基本思想是将图像递归地划分为四个象限,直到每个象限内的像素颜色一致为止。每个节点可以是以下三种类型:

  • p\texttt{p}pparent):表示内部节点,需要进一步划分四个子象限。
  • f\texttt{f}ffull):表示该区域全部为黑色像素。
  • e\texttt{e}eempty):表示该区域全部为白色像素。

题目中处理的图像尺寸为32×3232 \times 3232×32像素,总计102410241024个像素。艺术家要执行的操作是将两张图像进行叠加:在结果图像中,若某个像素在至少一张原图像中为黑色,则该像素为黑色,否则为白色。

输入包含多个测试用例,每个测试用例给出两个字符串,分别代表两张图像的四叉树先序遍历序列。树的深度不超过555(因为25=322^5 = 3225=32)。

输出需要计算叠加后图像中黑色像素的数量。

样例分析

以第一个样例为例:

  • 输入:ppeeefpffeefepepeefe
  • 输出:640640640个黑色像素

解题思路

核心问题转化

直接对四叉树进行“叠加”操作比较棘手,因为两棵树的结构可能不同(深度、分支情况各异)。一个更简单的方法是:

  1. 将四叉树的表示还原32×3232 \times 3232×32的像素网格。
  2. 在两幅网格上分别进行“着色”。
  3. 最后统计黑色像素的数量。

由于图像尺寸固定为32×3232 \times 3232×32,我们可以使用一个二维数组image[32][32]来存储每个像素的颜色状态。

四叉树的解析与着色

四叉树的先序遍历序列中,每个节点按以下规则处理:

  • 遇到p\texttt{p}p:该区域需要继续划分。按照固定的象限顺序(题目图示中明确),递归处理四个子区域。
  • 遇到e\texttt{e}e:该区域全部为白色,将其标记为白色。
  • 遇到f\texttt{f}f:该区域全部为黑色,将其标记为黑色。
象限划分顺序

从题目图示可以看出,四叉树的子节点顺序(先序遍历)为:

  1. 右上象限- 实际上根据代码实现:
    • 第一个递归:(x, y + width/2)—— 右上
    • 第二个递归:(x, y)—— 左上
    • 第三个递归:(x + width/2, y)—— 左下
    • 第四个递归:(x + width/2, y + width/2)—— 右下

叠加逻辑的实现

在代码中,叠加操作是通过顺序执行两次解析隐式完成的:

  1. 首先解析第一棵树,将对应区域标记为黑色(b\texttt{b}b)或白色(w\texttt{w}w)。
  2. 然后解析第二棵树。在解析过程中:
    • 如果遇到白色区域(e\texttt{e}e),只将尚未被标记为黑色的像素设为白色。
    • 如果遇到黑色区域(f\texttt{f}f),将对应区域强制覆盖为黑色(无论之前是什么颜色)。

这样,最终image数组中,b\texttt{b}b表示该像素在至少一张图像中为黑色,w\texttt{w}w表示两张图像中均为白色,0表示尚未被任何树处理过的区域(实际上在解析完两棵树后不会存在)。

为什么这样做是正确的?

叠加的定义是:结果图像中某像素为黑色⟺ \iff它在图像A中为黑色在图像B中为黑色。

  • 第一棵树解析后,黑色像素已被正确标记。
  • 第二棵树解析时,遇到黑色区域直接将其涂黑,这符合“或”操作。
  • 白色区域不会覆盖已有的黑色,这保证了黑色像素不会被错误地擦除。

因此,最终统计b\texttt{b}b的数量即可得到答案。

复杂度分析

  • 每个测试用例需要遍历32×32=102432 \times 32 = 102432×32=1024个像素。
  • 四叉树的节点数最多为1+4+42+43+44+45≈13651 + 4 + 4^2 + 4^3 + 4^4 + 4^5 \approx 13651+4+42+43+44+451365个,每个节点处理的区域大小与深度相关。
  • 总体时间复杂度为O(像素数+节点数)O(\text{像素数} + \text{节点数})O(像素数+节点数),对于本题规模完全可行。

代码实现

// Quadtrees// UVa ID: 297// Verdict: Accepted// Submission Date: 2016-05-10// UVa Run Time: 0.000s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;// 存储 32x32 图像的像素颜色// '0' 表示未处理,'b' 表示黑色,'w' 表示白色charimage[32][32];// 递归解析四叉树的先序遍历序列// tree: 先序遍历字符串// index: 当前处理到的位置(引用传递,便于递归推进)// x, y: 当前区域左上角坐标// width: 当前区域的边长voidparse(string&tree,int&index,intx,inty,intwidth){if(index<tree.length()&&tree[index]=='p'){// 内部节点:递归处理四个子象限// 顺序:右上、左上、左下、右下parse(tree,++index,x,y+width/2,width/2);parse(tree,++index,x,y,width/2);parse(tree,++index,x+width/2,y,width/2);parse(tree,++index,x+width/2,y+width/2,width/2);}elseif(index<tree.length()&&tree[index]=='e'){// 空节点:整个区域为白色// 只有当像素尚未被标记为黑色时,才标记为白色for(inti=x;i<x+width;i++)for(intj=y;j<y+width;j++)if(image[i][j]=='0'||image[i][j]=='w')image[i][j]='w';}elseif(index<tree.length()&&tree[index]=='f'){// 满节点:整个区域为黑色,直接覆盖for(inti=x;i<x+width;i++)for(intj=y;j<y+width;j++)image[i][j]='b';}}// 统计图像中黑色像素的数量intcount(){intcounter=0;for(inti=0;i<32;i++)for(intj=0;j<32;j++)if(image[i][j]=='b')counter++;returncounter;}intmain(intargc,char*argv[]){cin.tie(0);cin.sync_with_stdio(false);intn;cin>>n;string first,second;while(n--){// 初始化图像数组,所有像素标记为未处理 '0'for(inti=0;i<32;i++)for(intj=0;j<32;j++)image[i][j]='0';cin>>first>>second;// 解析第一棵树,标记黑色和白色区域intindex=0;parse(first,index,0,0,32);// 解析第二棵树,叠加黑色区域index=0;parse(second,index,0,0,32);cout<<"There are "<<count()<<" black pixels.\n";}return0;}

总结

本题的核心技巧是将树形结构的图像表示展开为二维网格,利用网格的固定尺寸简化叠加操作。这种方法避免了直接对两棵不同结构的四叉树进行合并的复杂性,代码实现清晰且易于理解。对于图像处理类问题,当图像尺寸固定且较小时,这种“暴力展开”的策略往往是高效且可靠的。

http://www.gsyq.cn/news/1398562.html

相关文章:

  • 别再死磕传统变焦了!用Zemax OpticStudio手把手教你设计Alvarez自由曲面变焦镜头
  • 一文教你解决kali docker拉取镜像慢的问题,网络安全零基础入门到精通实战教程!
  • 新手小白入门SRC漏洞挖掘经验分享,网络安全零基础挖SRC漏洞干货分享,SRC 漏洞挖掘实战教程!
  • 如何优雅且暴力的针对APP有校验加密的情况做测试?网络安全零基础入门到精通实战教程!
  • 2026龙鱼灯具品牌哪个好?马印凭复合调光与赛事背书进入候选 - 广州矩阵架构科技公司
  • 有了这个 Agent Skill 之后,只需一句指令,再也不需要手动去翻找 AI 热点新闻了
  • 240L垃圾桶模具技术解析:周转箱模具制造、周转箱模具开发、周转箱注塑模具、垃圾桶塑料垃圾桶模具、垃圾桶塑料模具选择指南 - 优质品牌商家
  • 5G PDCCH盲检不再难:手把手图解CORESET与Search Space配置流程
  • 芯片性能翻倍,实际效率却停滞不前?一组真实数据告诉你真相
  • 用TensorFlow Lite Micro在Arduino上跑第一个AI模型:从模型转换到LED亮度控制
  • Unity ShaderGraph数学节点实战:用Lerp和Remap轻松实现材质渐变与动态遮罩
  • 西南及全国液态金属漆厂家综合实力排行盘点:夯土漆厂家/成都仿石漆厂家/无机涂料价格/无机涂料厂家推荐/无机涂料外墙/选择指南 - 优质品牌商家
  • 微信单向好友检测:三步识别并清理你的无效社交关系
  • 双金属堆焊耐磨管厂家评测:双金属灰水耐磨管、灰水耐磨三通、双金属复合耐磨管、合金双金属耐磨管、电厂输粉双金属耐磨管选择指南 - 优质品牌商家
  • 告别‘yum makecache失败’:openEuler ARM服务器/虚拟机yum源配置的3个关键检查点与避坑指南
  • ShaderGraph避坑指南:从导入URP到属性公开,新手最容易卡住的5个问题及解决
  • 告别Link180!ANSYS Mechanical 2020R2之后,用Cable280单元搞定绳索仿真的正确姿势
  • NSSM进阶玩法:除了安装服务,这些配置项(日志、重启策略、依赖服务)让你的Windows服务更稳定
  • 知识全部免费了,为什么你还是那个“什么都懂却什么都做不成”的人?
  • 2026手机照片备份最全攻略|告别照片丢失!主流云盘横向对比,普通人直接抄作业
  • Win10/Win11下雷云3驱动打不开?别急着重装系统,试试这个手动修复服务的方法
  • 告别盲调!用S32K的FTM输入捕获模式精准测量PWM频率与占空比(含滤波配置)
  • 3步掌握Steam成就管理:SteamAchievementManager导出导入实战指南
  • 别再乱用欧氏距离了!用Python手把手教你计算二元变量相似度(附Jaccard系数实战代码)
  • 思维导图笔记: Agent架构与多智能体编排
  • Turnitin越查越严别乱改!实测英文论文降AI标准流与工具红黑榜
  • 用Python+粒子群算法搞定物流配送路径规划:一个完整可运行的CVRP求解器
  • C251架构2字节中断栈帧优化实践
  • 别再乱改grub了!用tuned优雅隔离CPU核心,让你的Linux应用性能飞起来
  • 不止于仿真:用PSpice分析H桥电机驱动,聊聊分立器件选型与国产驱动IC的发现