糟糕!邪恶的巫师 Nocoproco 抓住了你,并将你关进了他的地牢,这里没有出口。看起来你得在这里待上一段时间了,所以你最好利用这段时间好好探索一下这个地方。幸运的是,地牢里没有潜伏的怪物,所以探索应该相对安全。但仍然存在一些复杂情况。
地牢中最多可能有两扇隐藏的活板门。走进活板门会让你掉下去,并最终到达地牢的不同部分。更糟糕的是,地牢里几乎没有什么显著特征,所以你无法立即识别出之前访问过的位置,很容易迷失方向。不过,你有着敏锐的方向感,总是能分辨出哪个方向是北方。
地牢是一个矩形网格,每个单元格要么是墙壁、普通的开放空间,要么是活板门。在开放空间中,在昏暗的灯光下,你唯一能辨别的是四个相邻单元格(北、东、南、西方向)中哪些是墙壁,然后你可以走到任何不是墙壁的相邻单元格。如果你走进一扇活板门,你会在反应过来之前就掉进去,但在掉落之前,你有时间观察活板门相邻的四个单元格。
从地牢中的任何位置都可以到达任何其他位置(但可能需要使用活板门,如下面的样例交互 1 所示)。地牢也由一个单一区域组成——如果将活板门换成普通的开放空间,仍然可以从任何位置到达任何其他位置。活板门的终点可以在地牢中的任何开放空间,但不能在另一个活板门上,且两扇活板门的终点不在同一位置。你的起点既不是活板门,也不是活板门的终点。
编写一个程序来探索地牢并绘制完整的地图。
交互
这是一个交互式问题,按轮次进行。在每一轮交互中,你的程序首先读取有关你当前周围环境的信息,然后通过采取行动进行响应。
有关你当前周围环境的信息在单行上给出。该行以四个字符 $c_N, c_E, c_S$ 和 $c_W$ 开头,描述了你刚刚走进的单元格(或者对于第一轮,是起始单元格)在北、东、南、西方向上的周围环境。每个字符要么是 ‘#’,表示该方向上的单元格是墙壁;要么是 ‘.’,表示你可以走到那里。然后,同一行上会跟随单词 “trap”(如果你走进的单元格是活板门)或 “ok”(如果不是)。如果该单元格是活板门,该行还会包含第三个字符串,以与上述相同的格式描述活板门终点的周围环境。
有两种类型的操作:移动到相邻单元格,以及报告你已完成。要移动到相邻单元格,输出一行,包含 ‘N’、‘E’、‘S’ 和 ‘W’ 中的一个,分别对应向北、东、南、西移动。要报告你已完成,输出一行包含 “done”,随后是地牢的完整地图。将地图输出为最小尺寸的矩形网格,包括所有已见的墙壁。首先输出一行,包含两个整数 $h$ 和 $w$,表示网格的高度和宽度。然后输出 $h$ 行(从北到南),每行包含恰好 $w$ 个字符(从西到东),使用以下符号:
- ‘#’ 表示墙壁,以及地牢外其他无法到达的单元格。
- ‘S’ 表示你的起始位置。
- ‘A’ 和 ‘B’ 表示两扇活板门的位置。
- ‘a’ 和 ‘b’ 表示两扇活板门对应的终点位置。
- ‘.’ 表示其余可走动的单元格。
将哪扇活板门标记为 ‘A’ 以及哪扇标记为 ‘B’ 并不重要,只要 ‘a’ 是标记为 ‘A’ 的活板门的终点,‘b’ 同理即可。如果只有一扇活板门,你可以将其标记为 ‘A’ 或 ‘B’。输出地图后,交互结束,你的程序应该退出。
地牢中最多有 500 个可到达的位置。你的解决方案最多可以采取 $10^5$ 步。如果你试图走进墙壁,你的程序将被判定为 Wrong Answer。为了方便测试你的解决方案,我们提供了一个简单的工具,你可以从该问题的 Kattis 页面下载。记得在每次操作后刷新你的标准输出缓冲区!
样例
样例输入 1
#.#. ok #.#. trap .### ##.. trap #.## #.#. ok #.#. ok #.#. trap .###
样例输出 1
E N E E E done 4 7 ####### #b.SAB# #####a# #######
样例输入 2
.##. ok ..## ok #..# ok ##.. ok
样例输出 2
W N E done 4 4 #### #..# #.S# ####