P14866 [ICPC 2020 Yokohama R] Short Coding
题目描述
你参与了一个探索名为 **Yokohama 2020** 的小行星的项目。几年前的一次勘测发现其地下存在一个迷宫般的空间。该项目的目标是使用一个探索机器人对这个迷宫进行更详细的调查。
迷宫的形态已通过地质穿透雷达的勘测完全掌握。为了规划探索任务,迷宫被表示为一个单元格网格,其中第一行的第一个单元格位于网格的左上角,最后一行的最后一个单元格位于网格的右下角。
网格中的每个单元格要么是空的(允许机器人从相邻的空单元格移动到该单元格),要么充满岩石(阻碍此类移动)。迷宫的入口位于最顶行的某个单元格,出口位于最底行的某个单元格。
探索机器人由其内部存储的程序控制,该程序由按顺序编号的行组成,每行包含下述五种命令之一。寄存器 **pc** 指定要执行的程序行号。每条命令都规定了机器人的一个动作以及要设置给 **pc** 的值。
机器人从迷宫入口处开始,面朝下方,**pc** 的值被设置为 $1$。程序将重复地执行 **pc** 指定的行上的命令,一条接一条,直到机器人到达迷宫出口。
当 **pc** 的值因其递增而超过程序的行数时,它将被重置为 $1$。机器人一旦到达出口单元格即停止,这即是项目的目标。
由于机器人程序存储器的容量非常有限,程序的行数应尽可能少。你的任务是开发一个行数尽可能少的程序,且该程序最终能将机器人引导至出口。
输入格式
输入包含单个测试用例,格式如下。
$$n \ m$$
$$s_1$$
$$\vdots$$
$$s_n$$
第一行包含两个整数 $n$ ($2 \le n \le 10$)和 $m$ ($2 \le m \le 10$)。迷宫表示为一个 $n$ 行 $m$ 列的网格。接下来 $n$ 行描述该网格。每行包含一个长度为 $m$ 的字符串,对应网格的一行。第 $j$ 个字符串的第 $i$ 个字符(可能是 `.` 、 `#`、 `S` 或 `G`)描述了第 $j$ 行第 $i$ 列的单元格。`.` 表示该单元格是空的,机器人可以从四个相邻单元格之一移动到该位置。`#` 表示该单元格被填充,阻碍机器人移动到该位置。`S` 表示该单元格是入口,`G` 表示该单元格是出口。这些单元格当然也是空的。
已知存在一个能将机器人引导至出口的程序。
| 命令 | 描述 |
|:---:|:---:|
| **GOTO $l$** | 将 **pc** 设置为 $l$。命令参数 $l$ 是一个正整数,且小于或等于程序的行数。 |
| **IF-OPEN $l$** | 如果当前朝向存在一个空的相邻单元格,则将 **pc** 设置为 $l$;否则(即面对一个被填充的单元格或网格边界),将 **pc** 增加 $1$。命令参数 $l$ 是一个正整数,且小于或等于程序的行数。 |
| **FORWARD** | 如果当前朝向存在一个空的相邻单元格,则移动到该单元格;否则,停留在当前单元格。无论哪种情况,都将 **pc** 增加 $1$。 |
| **LEFT** | 向左转 $90$ 度,不改变位置,并将 **pc** 增加 $1$。 |
| **RIGHT** | 向右转 $90$ 度,不改变位置,并将 **pc** 增加 $1$。 |
输出格式
输出的第一行应包含程序的行数。接下来,应按其行号顺序,每行输出一个程序命令。当命令有参数时,命令名称和参数之间仅输出一个空格。
如果有多个具有最少行数的合适程序,输出其中任意一个均可。