#P14866. [ICPC 2020 Yokohama R] Short Coding

[ICPC 2020 Yokohama R] Short Coding

Description

你参与了一个探索名为 Yokohama 2020 的小行星的项目。几年前的一次勘测发现其地下存在一个迷宫般的空间。该项目的目标是使用一个探索机器人对这个迷宫进行更详细的调查。

迷宫的形态已通过地质穿透雷达的勘测完全掌握。为了规划探索任务,迷宫被表示为一个单元格网格,其中第一行的第一个单元格位于网格的左上角,最后一行的最后一个单元格位于网格的右下角。

网格中的每个单元格要么是空的(允许机器人从相邻的空单元格移动到该单元格),要么充满岩石(阻碍此类移动)。迷宫的入口位于最顶行的某个单元格,出口位于最底行的某个单元格。

探索机器人由其内部存储的程序控制,该程序由按顺序编号的行组成,每行包含下述五种命令之一。寄存器 pc 指定要执行的程序行号。每条命令都规定了机器人的一个动作以及要设置给 pc 的值。

机器人从迷宫入口处开始,面朝下方,pc 的值被设置为 11。程序将重复地执行 pc 指定的行上的命令,一条接一条,直到机器人到达迷宫出口。

pc 的值因其递增而超过程序的行数时,它将被重置为 11。机器人一旦到达出口单元格即停止,这即是项目的目标。

由于机器人程序存储器的容量非常有限,程序的行数应尽可能少。你的任务是开发一个行数尽可能少的程序,且该程序最终能将机器人引导至出口。

Input Format

输入包含单个测试用例,格式如下。

n mn \ m s1s_1 \vdots sns_n

第一行包含两个整数 nn2n102 \le n \le 10)和 mm2m102 \le m \le 10)。迷宫表示为一个 nnmm 列的网格。接下来 nn 行描述该网格。每行包含一个长度为 mm 的字符串,对应网格的一行。第 jj 个字符串的第 ii 个字符(可能是 .#SG)描述了第 jj 行第 ii 列的单元格。. 表示该单元格是空的,机器人可以从四个相邻单元格之一移动到该位置。# 表示该单元格被填充,阻碍机器人移动到该位置。S 表示该单元格是入口,G 表示该单元格是出口。这些单元格当然也是空的。

已知存在一个能将机器人引导至出口的程序。

命令 描述
GOTO ll pc 设置为 ll。命令参数 ll 是一个正整数,且小于或等于程序的行数。
IF-OPEN ll 如果当前朝向存在一个空的相邻单元格,则将 pc 设置为 ll;否则(即面对一个被填充的单元格或网格边界),将 pc 增加 11。命令参数 ll 是一个正整数,且小于或等于程序的行数。
FORWARD 如果当前朝向存在一个空的相邻单元格,则移动到该单元格;否则,停留在当前单元格。无论哪种情况,都将 pc 增加 11
LEFT 向左转 9090 度,不改变位置,并将 pc 增加 11
RIGHT 向右转 9090 度,不改变位置,并将 pc 增加 11

Output Format

输出的第一行应包含程序的行数。接下来,应按其行号顺序,每行输出一个程序命令。当命令有参数时,命令名称和参数之间仅输出一个空格。

如果有多个具有最少行数的合适程序,输出其中任意一个均可。

2 2
.S
G#
2
FORWARD
LEFT
5 2
S.
..
..
..
.G
3
IF-OPEN 3
LEFT
FORWARD
2 6
..S...
..#.G#
4
RIGHT
RIGHT
FORWARD
GOTO 2
10 10
.##S...##.
..#...#...
..#...#...
.###...##.
..........
..........
.##....##.
.#.#..#...
.##...#...
.#.....G#.
5
LEFT
FORWARD
RIGHT
FORWARD
IF-OPEN 4