你参与了一个探索名为 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$ |
将 $l$ 设置为 pc。命令参数 $l$ 是一个小于或等于程序行数的正整数。 |
IF-OPEN $l$ |
如果当前方向上有相邻的空地,则将 $l$ 设置为 pc;否则(即面对被填满的单元格或网格边界),将 pc 加 1。命令参数 $l$ 是一个小于或等于程序行数的正整数。 |
FORWARD |
如果当前方向上有相邻的空地,则移动到那里;否则,停留在当前单元格。无论哪种情况,都将 pc 加 1。 |
LEFT |
向左转 90 度而不改变位置,并将 pc 加 1。 |
RIGHT |
向右转 90 度而不改变位置,并将 pc 加 1。 |
样例
样例输入 1
2 2 .S G#
样例输出 1
2 FORWARD LEFT
样例输入 2
5 2 S. .. .. .. .G
样例输出 2
3 IF-OPEN 3 LEFT FORWARD
样例输入 3
2 6 ..S... ..#.G#
样例输出 3
4 RIGHT RIGHT FORWARD GOTO 2
样例输入 4
10 10 .##S...##. ..#...#... ..#...#... .###...##. .......... .......... .##....##. .#.#..#... .##...#... .#.....G#.
样例输出 4
5 LEFT FORWARD RIGHT FORWARD IF-OPEN 4