这是一个交互式问题。请记得在每次输出后清空输出缓冲区。你可以使用以下方法清空输出:
- C/C++ 中的
fflush(stdout)或cout.flush(); - Java 和 Kotlin 中的
System.out.flush(); - Python 中的
sys.stdout.flush()。
你正在一个大小为 $n \times m$ 的网格上玩经典的贪吃蛇游戏。行从上到下依次编号为 $1$ 到 $n$,列从左到右依次编号为 $1$ 到 $m$。我们用 $(i, j)$ 表示位于第 $i$ 行第 $j$ 列的单元格。
蛇可以表示为一个坐标对序列,用于确定其身体所在的位置:$(x_1, y_1), (x_2, y_2), \dots, (x_k, y_k)$。这里,$k$ 表示蛇的长度。蛇头位于 $(x_1, y_1)$,蛇尾位于 $(x_k, y_k)$,身体的相邻部分位于共享一条边的单元格中。
最初,蛇的长度为 $1$,位于给定的单元格 $(r_s, c_s)$。
有 4 种移动蛇的指令:
U:指挥蛇向上移动一步。蛇头将移动到 $(x_1 - 1, y_1)$。D:指挥蛇向下移动一步。蛇头将移动到 $(x_1 + 1, y_1)$。L:指挥蛇向左移动一步。蛇头将移动到 $(x_1, y_1 - 1)$。R:指挥蛇向右移动一步。蛇头将移动到 $(x_1, y_1 + 1)$。
当蛇头移动时,身体的每个部分也随之移动。具体来说,身体的第 $i$ 部分($2 \le i \le k$)会移动到该指令执行前第 $i - 1$ 部分所在的位置。同时,原先被蛇尾占用的单元格变为空闲。
蛇不能移动到网格外部。此外,蛇不能与自身相撞——你必须保证在任何指令之后,身体的任意两个部分都不会占用同一个单元格。考虑以下边界情况:蛇头位于 $(x_1, y_1)$,蛇尾位于 $(x_k, y_k)$。如果蛇头正移动到 $(x'_1, y'_1)$,那么允许 $(x'_1, y'_1) = (x_k, y_k)$:如果考虑现实中的场景,蛇头移入该单元格的同时,蛇尾正好移出。类似地,当 $k = 2$ 时,允许通过单次指令交换蛇头和蛇尾的位置。
会有 $(nm - 1)$ 个苹果依次出现。每次,一个苹果会出现在当前未被蛇占用的某个单元格 $(r, c)$ 处。你需要输出一个指令序列,将蛇头移动到苹果所在的位置。蛇头必须在最后一条指令时恰好到达 $(r, c)$,并且在此之前不能进入 $(r, c)$。
对于你输出的每个指令序列,除最后一条指令外的每条指令都是普通移动:蛇尾会如上所述腾出其所在的单元格。序列中的最后一条指令是进食移动:当蛇头到达 $(r, c)$ 时,蛇会吃掉苹果。在这次移动中,蛇尾不会腾出其所在的单元格,因此蛇的长度增加 $1$。
你的任务是成功吃掉所有 $(nm - 1)$ 个苹果。
输入格式
每个测试点包含多个测试用例。输入的第一行包含一个整数 $T$($1 \le T \le 100$),表示测试用例的数量。对于每个测试用例:
第一行包含四个整数 $n$、$m$、$r_s$ 和 $c_s$($2 \le n, m \le 50$,$nm \le 100$,$1 \le r_s \le n$,$1 \le c_s \le m$),表示网格的大小和蛇的起始位置。
交互格式
你需要一个接一个地吃掉所有 $(nm - 1)$ 个苹果。对于每个苹果:
- 读取一行,包含两个整数 $r$ 和 $c$($1 \le r \le n$,$1 \le c \le m$),表示苹果的位置。保证苹果的位置当前未被蛇占用。
- 输出一个由字符
U、D、L、R组成的字符串——将蛇头从当前位置移动到 $(r, c)$ 的指令序列。为了增加问题的难度,我们限制该字符串的长度最多为 $nm$。
在打印每行后,请确保清空输出缓冲区。可以证明,答案总是存在。
样例
输入样例 1
2 2 3 1 2 2 1 1 3 2 1 1 1 1 2 2 2 1 1 2 2 1 1 1 2
输出样例 1
LD URR DLL U R RD LU R
说明
下图展示了吃掉 3 个苹果后的第一个样例测试用例。
吃掉 3 个苹果后的第一个样例测试用例