这题的关键是正确判断“可见”。
窗口之间的遮挡规则本质上是一个优先级比较:
模拟实现一个屏幕上的窗口管理器。屏幕的宽高在初始化时指定,坐标系以屏幕左上角为原点 (0,0),横向向右为 x 轴正方向,纵向向下为 y 轴正方向。
每个窗口具有以下属性:
name:窗口名,用于唯一标识一个窗口;(x, y);w 与高度 h;level;一个窗口占据的屏幕区域定义为所有满足 x≤u<x+w 且 y≤v<y+h 的坐标 (u,v) 组成的集合。
窗口之间的遮挡与可见性遵循以下规则:
resize 和 move 操作不会改变窗口的创建先后顺序;需要支持以下操作:
init:给定屏幕宽高。若宽高均为正整数,则初始化屏幕并返回 true;否则返回 false。createWindow:给定窗口名、左上角坐标、宽高和层级。若宽高均为正整数且窗口名未被使用,则创建窗口并返回 true;否则返回 false。removeWindow:给定窗口名。若窗口存在,则移除该窗口并返回 true;否则返回 false。resize:给定窗口名和新宽高。若窗口存在且新宽高均为正整数,则修改窗口尺寸并返回 true;否则返回 false。move:给定窗口名和新左上角坐标。若窗口存在,则修改窗口位置并返回 true;否则返回 false。queryVisibility:给定窗口名。若窗口存在且当前可见,返回 true;否则返回 false。queryAllVisibleWindows:给定一个屏幕范围内的矩形区域(左上角坐标及宽高)。找出所有与该区域有交集,并且在该交集中存在可见部分的窗口。返回结果按层级降序排列;若层级相同,则按窗口名字典序升序排列。若有可见窗口,将窗口名用 ; 拼接返回;若没有可见窗口,返回 NoVisibleWindow。约束条件:
操作总数不超过 100。
输入由多行组成,每行表示一个操作。每行的第一个字段为操作名,后续字段为对应参数,字段之间用空格分隔。
输入保证第一个操作固定为 init。若 init 返回 false,则后续不会再有操作。
各操作的输入格式如下:
init w hcreateWindow name x y w h levelremoveWindow nameresize name w hmove name x yqueryVisibility namequeryAllVisibleWindows x y w h其中 name 为窗口名字符串,其余参数均为整数。
对于每个输入操作,输出一行对应的返回值。
对于返回布尔值的操作,输出 true 或 false。
对于 queryAllVisibleWindows,输出排序后的窗口名拼接结果;若不存在可见窗口,输出 NoVisibleWindow。
输入
init 100 100
createWindow A 10 10 50 50 1
createWindow B 30 30 50 50 1
queryVisibility A
queryVisibility B
queryAllVisibleWindows 0 0 100 100
输出
true
true
true
true
true
A;B
说明
屏幕大小为 100 × 100。窗口 A 与 B 层级相同,而 B 创建更晚,因此 B 可遮挡 A 的重叠部分。重叠部分位于 A 区域的中部偏右下位置,该部分被 B 覆盖,但 A 在左侧和上侧仍有未被遮挡的点,因此 A 可见。B 没有被其他可遮挡它的窗口覆盖,也可见。
对整个屏幕进行区域查询时,两个窗口均可见。由于层级相同,按窗口名字典序升序排列,输出 A;B。
输入
init 300 300
createWindow alpha 0 0 100 100 5
createWindow beta 20 20 100 100 3
createWindow gamma 40 40 100 100 5
queryAllVisibleWindows 0 0 300 300
输出
true
true
true
true
alpha;gamma;beta
说明
屏幕大小为 300 × 300。alpha 与 gamma 层级均为 5,而 gamma 创建较晚,因此 gamma 能遮挡 alpha 的重叠部分;但 alpha 仍有未被遮挡的点,所以可见。beta 层级为 3,低于两个 5 级窗口,两个高层窗口会遮挡 beta 的部分区域,但并未完全覆盖 beta 的整个区域,因此 beta 也可见。
查询整个屏幕时,三个窗口均可见。排序先按层级降序,层级为 5 的 alpha 与 gamma 在同一层,按窗口名升序排列为 alpha、gamma,再排层级为 3 的 beta,最终输出 alpha;gamma;beta。
输入
init 0 100
输出
false
说明
屏幕宽高必须均为正整数。输入的高度为 0,不是正整数,因此初始化失败,返回 false。由于初始化失败,后续不会有操作。
© CodeFun2000 · 使用条款
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册