当前位置: 首页 > 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.jsqmd.com/news/894170/

相关文章:

  • Cortex-M4外部Flash断点调试问题解决方案
  • 从开发者角度观察Taotoken平台模型更新与路由优化的及时性体验
  • 2026年5月更新指南:武安靠谱的单招机构企业选择策略解析 - 2026年企业资讯
  • AIoT与嵌入式系统深度解析:2026软考案例核心考点全攻略
  • 量子机器学习在药物发现中的创新应用
  • 别再乱改grub了!用tuned优雅隔离CPU核心,让你的Linux应用性能飞起来
  • 2026年Q2杭州智显货架评测:杭州更鞋柜、杭州校园存包柜、杭州耗材管理柜、杭州警用装备柜、浙江RFID智能货架选择指南 - 优质品牌商家
  • C51开发中stdarg.h实现机制与内存模型解析
  • 2026年乐山汽车改装公司实测评测:乐山汽车内饰改装/乐山汽车刹车改装/乐山汽车外观改装/乐山汽车延保服务/乐山汽车改装备案/选择指南 - 优质品牌商家
  • 2026年5月有名的蝶阀订购厂家深度评测:技术驱动下的阀门优选之道 - 2026年企业资讯
  • ShaderGraph避坑指南:从导入URP到属性公开,新手最容易卡住的5个问题及解决
  • B41C2 是什么牌号?四川莱韦美特高强变形镁合金 B41C2 参数详解(兼谈与 B91C2 的区别与选型)
  • Arm ISP多上下文环境构建与优化实战指南
  • B91C2 是什么牌号?四川莱韦美特高强变形镁合金 B91C2 参数、命名、对标与应用全解读
  • 西南市政管网服务企业排行:成都荣晟祥发市政工程有限公司联系/四川非开挖顶管置换修复联系电话/园区管道探测哪家好/选择指南 - 优质品牌商家
  • 保姆级图解:Android相机从App点击到出图的完整请求链路(以Camera Service为核心)
  • 2026龙鱼灯具品牌哪个好?马印凭复合调光与赛事背书进入候选 - 广州矩阵架构科技公司
  • 光纤传感与光学计算融合技术及其在机器人监测中的应用
  • 保姆级教程:在CentOS 7上用源码编译安装Netdata性能监控面板(附常见启动失败排查)
  • 用Python爬虫+数据分析,揭秘《最后一片叶子》的词汇密码与情感曲线(附完整代码)
  • 跟着 MDN 学CSS day_19:(实战挑战之内容面板的尺寸与装饰)
  • 龙鱼灯具选购常见的3个误区:2026年龙鱼照明避坑指南与品牌决策清单 - 广州矩阵架构科技公司
  • T113-S3上给Tina5.0系统加装USB WiFi(RTL8188FU)的完整避坑指南
  • 银河麒麟V10/V10.1系统换源保姆级教程:告别官方源慢,一键配置国内镜像(附各版本源地址)
  • Java语言概述
  • 用Python+爬虫+数据分析,量化分析《最后一片叶子》的文本情感与角色关系
  • 3分钟学会AI虚拟试衣:玩转电商试衣教程
  • 基数排序:高效稳定的数字排序算法
  • 240L垃圾桶模具技术解析:周转箱模具制造、周转箱模具开发、周转箱注塑模具、垃圾桶塑料垃圾桶模具、垃圾桶塑料模具选择指南 - 优质品牌商家
  • Kafka监控与调优实战指南