QOJ.ac

QOJ

حد الوقت: 2 s حد الذاكرة: 1024 MB مجموع النقاط: 100

#4688. 窗口管理器

الإحصائيات

过去几年,用户界面技术经历了一场革命。多年来,键盘和鼠标一直是与计算机交互的工具。但随着智能手机和平板电脑的出现,人们越来越多地通过在屏幕上点击和移动手指来使用计算机。自然地,这导致了用户界面设计的新范式。一个重要的原则是显示器上的对象遵循“物理”定律。在本题中,你将看到这方面的一个例子。

你受雇为 Advanced Cellular Manufacturers (ACM) 的下一代智能手机构建一个窗口管理器模拟器。他们生产的每部手机都有一个矩形屏幕,可以完整显示零个或多个矩形窗口。也就是说,没有任何窗口会超出屏幕边界或与其他窗口重叠。模拟器必须支持以下命令:

  • OPEN x y w h — 打开一个左上角坐标为 $(x, y)$,宽度为 $w$ 像素,高度为 $h$ 像素的新窗口。
  • CLOSE x y — 关闭包含像素 $(x, y)$ 的打开窗口。这允许用户点击窗口上的任意位置来关闭它。
  • RESIZE x y w h — 将包含像素 $(x, y)$ 的窗口尺寸设置为宽度 $w$ 和高度 $h$。窗口的左上角位置保持不变。
  • MOVE x y dx dy — 移动包含像素 $(x, y)$ 的窗口。移动方向为水平方向 $d_x$ 像素或垂直方向 $d_y$ 像素。$d_x$ 和 $d_y$ 中最多只有一个是非零值。

OPENRESIZE 命令仅在生成的窗口不与其他窗口重叠且不超出屏幕边界时才会成功。MOVE 命令将尽可能多地移动窗口。例如,如果 $d_x$ 为 $30$,但窗口向右只能移动 $15$ 像素,那么它将移动 $15$ 像素。

ACM 对 MOVE 命令感到特别自豪。一个正在移动的窗口可能会“撞到”另一个窗口。在这种情况下,第一个窗口会像物理对象一样,将第二个窗口沿相同方向推动尽可能远的距离。这种行为可能会级联——移动的窗口可能会遇到其他窗口,这些窗口也会根据需要被推开。图 M.1 展示了一个包含三个窗口的例子,其中窗口 A 向右移动,推动了其他两个窗口。

图 M.1: MOVE 示例

输入格式

输入的第一行包含两个正整数 $x_{\max}$ 和 $y_{\max}$,分别表示屏幕的水平和垂直尺寸(以像素为单位)。每个值最大为 $10^9$(ACM 计划制造具有极高分辨率的显示器)。屏幕左上角像素的坐标为 $(0, 0)$。接下来的每一行包含一个如上所述的命令。命令名称和参数之间由一个或多个空格分隔。命令参数是满足以下条件的整数:$0 \le x < x_{\max}$,$0 \le y < y_{\max}$,$1 \le w, h \le 10^9$,以及 $|d_x|, |d_y| \le 10^9$。命令总数不超过 $256$ 个。

输出格式

输出必须遵循下方样例输出所示的格式。

按照输入中出现的顺序模拟命令。如果在模拟命令期间检测到任何错误,请显示命令编号、命令名称以及以下列表中的第一个适用消息,并忽略该命令的模拟结果(除非另有说明):

  • no window at given position — 适用于 CLOSERESIZEMOVE 命令 — 如果指定位置没有包含任何窗口。
  • window does not fit — 适用于 OPENRESIZE 命令 — 如果生成的窗口会与其他窗口重叠或超出屏幕边界。
  • moved d' instead of d — 适用于 MOVE 命令 — 如果命令要求将窗口移动 $d$ 像素,但在需要窗口移动超出屏幕边界之前只能移动 $d'$ 像素。值 $d$ 和 $d'$ 分别是请求移动和实际移动的像素绝对值。在这种情况下,窗口仍然会移动,但仅移动较小的距离。

在所有命令模拟完毕并显示所有错误消息后,指出仍然打开的窗口数量。然后,按照窗口打开的顺序,依次显示每个打开窗口的左上角坐标 $(x, y)$、宽度和高度。

样例

样例输入 1

320 200
OPEN 50 50 10 10
OPEN 70 55 10 10
OPEN 90 50 10 10
RESIZE 55 55 40 40
RESIZE 55 55 15 15
MOVE 55 55 40 0
CLOSE 55 55
CLOSE 110 60
MOVE 95 55 0 -100

样例输出 1

Command 4: RESIZE - window does not fit
Command 7: CLOSE - no window at given position
Command 9: MOVE - moved 50 instead of 100
2 window(s):
90 0 15 15
115 50 10 10

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.