QOJ.ac

QOJ

実行時間制限: 10 s メモリ制限: 2048 MB 満点: 100

#2345. 机器人卡雷尔

統計

你知道“机器人”(robot)这个词已经有近 100 年的历史了吗?它最早出现在 1920 年捷克作家卡雷尔·恰佩克(Karel Čapek)创作的科幻剧本《R.U.R.》中。为了向这位捷克作家致敬,多年后斯坦福大学将一种教育编程语言命名为 Karel。你的任务是实现该编程语言简化版本的解释器。

Karel 编程语言控制着一个名为 Karel 的机器人,它生活在一个由单位正方形组成的网格中。有些方格是空的,而另一些则包含障碍物。Karel 总是占据其中一个空方格,并面向四个基本方向之一。两个基本命令是“向前移动”(move forward)和“左转”(turn left)。该语言还提供了简单的条件语句和循环语句。该语言的主要教育潜力在于能够定义用于更复杂任务的新过程。

我们简化版本的语言可以通过以下语法描述:

:= "" |

:= "m" | "l" | | "i" "(" ")(" ")" | "u" "(" ")"

:= "b" | "n" | "s" | "e" | "w"

:=

:= "="

共有五种类型的命令:

  • m(“向前移动”)将 Karel 的位置沿其当前朝向向前推进一个网格方格,除非前方有障碍物,在这种情况下该命令无效。
  • l(“左转”)使 Karel 向左旋转 90 度。
  • X(其中 X 为任意大写字母)调用名为 X 的过程。
  • i(“如果”)后跟一个单字母条件和括号内的两个程序。如果条件满足,则执行第一个程序。否则,执行第二个程序。
  • u(“直到”)后跟一个单字母条件和括号内的一个程序。如果条件满足,则什么都不做。否则,执行该程序,然后重复执行该命令。

条件可以是 ‘b’,当且仅当 Karel 当前朝向的下一个方格有障碍物时满足;或者是四个方向字母 ‘n’、‘s’、‘e’ 或 ‘w’ 之一,当且仅当 Karel 当前的朝向分别为北、南、东或西时满足。

例如,简单的程序 ub(m) 可以理解为:“持续向前移动直到遇到障碍物”,而 un(l) 意味着“转向北方”。过程定义 R=lll 定义了一个新过程 ‘R’,其效果是“向右转”。

输入格式

输入的第一行包含四个整数 $r, c, d$ 和 $e$,其中 $r$ 和 $c$ ($1 \le r, c \le 40$) 是 Karel 生活的网格尺寸,$d$ ($0 \le d \le 26$) 是过程定义的数量,$e$ ($1 \le e \le 10$) 是要执行的程序数量。

接下来是 $r$ 行描述网格(从北向南),每行包含 $c$ 个字符(从西向东),每个字符要么是 ‘.’(表示空方格),要么是 ‘#’(表示障碍物)。给定区域之外的所有方格都被视为障碍物,这意味着 Karel 永远不会离开该区域。

接下来的 $d$ 行,每行包含一个过程定义,将一个过程名称(一个大写字母)与构成过程体的程序关联起来。没有过程名称会被定义超过一次。过程体可能包含尚未定义的过程调用。

最后 $2e$ 行描述要执行的程序。每个描述由一对行组成。每对的第一行包含两个整数 $i$ 和 $j$ 以及一个字符 $h$,其中 $i$ ($1 \le i \le r$) 是行号,$j$ ($1 \le j \le c$) 是列号,表示 Karel 的初始位置,$h \in \{n, s, e, w\}$ 表示 Karel 的初始朝向。保证初始位置是一个空方格。每对的第二行包含要从该初始位置执行的程序。

所有过程体和所有要执行的程序长度至少为 1 且最多为 100 个字符,语法正确,并且仅包含已定义的过程调用。包含过程定义和要执行的程序的行不包含任何空白字符。

输出格式

对于每个程序执行,输出 Karel 在从各自初始位置执行完完整程序后的最终位置。遵循描述初始位置的格式,即两个数字和一个方向字符。如果某个特定的执行永远不会终止,则输出 inf。

样例

样例输入 1

4 8 5 7
.......#
..#....#
.###...#
.....###
R=lll
G=ub(B)
B=ub(m)lib(l)(m)
H=ib()(mmHllmll)
I=III
1 1 w
G
1 1 e
G
2 2 n
G
2 6 w
BR
4 1 s
ib(lib()(mmm))(mmmm)
1 1 e
H
2 2 s
I

样例输出 1

1 1 w
inf
1 1 w
2 4 s
4 4 e
1 4 e
inf

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.