QOJ.ac

QOJ

Time Limit: 5 s Memory Limit: 2048 MB Total points: 100

#10318. Pinball

统计

你正在一个 $h \times w$ 的网格上玩一种类似弹球的游戏。

游戏开始时,一个小球位于标记为 S 的特定单元格中心。网格中的每个单元格属于以下类型之一:

  • 块状墙 (#):阻止小球进入该单元格,并将其反弹。
  • 薄斜墙:左倾 () 或右倾 (/),根据其方向反射小球。
  • 自由单元格 (.):小球可以在其中自由移动。

目标是让小球逃离网格。

开始时,你可以将小球向四个方向之一推动:上 (U)、下 (D)、左 (L) 或右 (R)。小球穿过一个自由单元格需要一秒钟,进入并离开一个包含薄斜墙的单元格需要一秒钟,从块状墙上反弹则不需要时间(块状墙占据了其所在单元格的全部空间)。

小球与所有墙壁(包括块状墙和斜墙)之间的碰撞都是完全弹性的,接触时会导致小球反射。

例如,小球进入一个自由单元格、穿过它、从相邻的块状墙反弹并穿回该自由单元格直到离开,总共需要两秒钟。

在小球移动过程中,你可以随时摧毁斜墙,将其永久变为自由单元格。你可以在游戏过程中的任何时刻摧毁多面斜墙。

确定小球是否能够逃离,如果可以,找出需要摧毁的斜墙的最小数量,以及每面被选中的墙需要被摧毁的精确时间。

输入格式

第一行包含两个整数 $h$ 和 $w$ ($1 \le h, w \le 1000$),表示网格的大小。

接下来的 $h$ 行描述了游戏开始时的网格。

其中第 $i$ 行包含 $w$ 个字符,描述了第 $i$ 行的单元格。点 (.) 表示自由单元格,井号 (#) 表示块状墙,() 或 (/) 表示薄斜墙,S 表示小球的起始位置(起始位置是一个自由单元格)。

保证所有描述网格的 $h \cdot w$ 个字符均属于集合 $\{., \#, \backslash, /, S\}$,且字符 S 恰好出现一次。

输出格式

如果能够让小球逃离网格,输出 YES。否则,输出 NO。

如果可以逃离,请输出以下额外信息。

第二行输出一个字符 $d \in \{U, D, L, R\}$,表示小球开始推动的方向。

第三行输出 $k$,表示需要摧毁的斜墙的最小数量。

接下来的 $k$ 行,每行输出三个整数 $t_i, r_i, c_i$,表示位于从上往下第 $r_i$ 行、从左往右第 $c_i$ 列的斜墙在小球开始移动 $t_i$ 秒后被摧毁。注意,相应的墙是在 $t_i$ 秒即将到达之前被摧毁的,这意味着如果小球本应在开始后恰好 $t_i$ 秒撞击该墙,那么该单元格此时表现为自由单元格。

操作必须按时间顺序打印(即对于所有 $1 \le i \le k - 1$,满足 $t_i \le t_{i+1}$)。同一面墙不能被多次摧毁(即如果 $i \neq j$,则 $(r_i, c_i) \neq (r_j, c_j)$)。对于所有 $1 \le i \le k$,初始时在 $(r_i, c_i)$ 处必须存在一面斜墙。

所有 $t_i$ 必须满足 $0 \le t_i \le 10^7$。可以证明,如果存在解,则一定存在一个所有 $t_i$ 均不超过 $10^7$ 的解。

样例

输入 1

4 6
#\###.
#./S##
#\\..#
######

输出 1

YES
L
2
7 3 3
8 1 2

说明 1

需要摧毁的墙的最少数量为 2。我们描述样例输出中给出的解的相关时刻。

  • 在时间 $t = 0$ 时,小球处于初始位置并被向左推动。
  • 在时间 $t = 4.5$ 时,小球撞击一面块状墙并反弹。
  • 在 $t = 7$ 之前,位置 $(3, 3)$ 处的墙被摧毁。
  • 在 $t = 8$ 之前,位置 $(1, 2)$ 处的墙被摧毁。
  • 在时间 $t = 10.5$ 时,小球最终逃离了网格。

输入 2

3 3
###
.S.
###

输出 2

YES
R
0

说明 2

你只需将小球向左或向右推动,小球最终就会逃离网格。

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.