QOJ.ac

QOJ

Límite de tiempo: 2 s Límite de memoria: 512 MB Puntuación total: 100 Comunicación

#2352. 带有提示的迷宫

Estadísticas

Thor 向矮人们吹嘘说,他仅凭一个小火把就能在没有任何魔法帮助的情况下穿过任何迷宫。矮人们决定考验一下 Thor。他们是快速而熟练的建造者,他们建造的新迷宫既庞大又棘手。如果冒险者在里面走得太久,火把就会熄灭,矮人们就会嘲笑这位“王牌”。在看了一眼新建筑后,Thor 决定无论付出什么代价都要获胜,于是他向 Loki 寻求帮助。

Loki 是一个足智多谋的恶作剧者,他能在迷宫建成后立即获得迷宫地图。但他不能直接把地图给 Thor:矮人们肯定会识破这种欺骗。Thor 只能从 Loki 那里得到一个简短的提示……

帮助 Thor 和 Loki 准备传递提示,以便 Thor 能够在火把熄灭前走出迷宫。

迷宫结构

矮人们建造的迷宫可以看作是一个 $n \times n$ 的方格棋盘。在每两个水平或垂直相邻的方格之间,要么是通道,要么是墙壁。此外,整个迷宫被墙壁包围。入口在左下角的方格,出口在右上角的方格。

矮人们建造墙壁的方式如下:他们以随机顺序考虑迷宫内所有可能的墙壁位置,每个位置恰好一次。在每一个这样的位置,如果竖起一堵墙后,仍然可以从迷宫的每一个方格移动到其他任何方格,他们就会竖起这堵墙。

在文本形式中,迷宫由 $2n + 1$ 行给出,每行包含 $2n + 1$ 个字符。从 1 开始计数,偶数行和偶数列对应方格,奇数行和奇数列对应它们之间的墙壁。“.”字符对应一个方格或通道,“#”字符对应一堵墙或墙壁之间的连接点。特别地,偶数行和偶数列上的字符始终是点(即方格),奇数行和奇数列上的字符始终是井号(即墙壁之间的连接点)。

下方的样例中可以看到一个 $5 \times 5$ 迷宫的地图表示。此外,为了方便本地测试,您可以从测试系统的“Samples ZIP”中下载所有奇数编号测试点的迷宫。

交互

在本题中,您的程序在每个测试点上将被运行两次。

在第一次运行中,程序获取地图并以 Loki 的身份写入提示。第一行包含单词 “view”。第二行包含一个整数 $n$,即迷宫的大小($5 \le n \le 200$)。接下来的 $2n + 1$ 行,每行包含 $2n + 1$ 个字符。这些行共同构成了迷宫的地图。

程序必须打印一行:Loki 将发送给 Thor 的提示。该提示必须由数字 0 和 1 组成,长度在 0 到 1000 个字符之间。

在第二次运行中,程序获取提示并以 Thor 的身份在迷宫中行走。此运行是交互式的。第一行包含单词 “walk”。第二行包含 Loki 给 Thor 的提示:即程序在第一次运行中打印的提示。第三行包含整数 $n$,即迷宫的大小,与第一次运行相同。

此后,程序将获得 Thor 在火把帮助下看到的迷宫片段,并应以 Thor 下一步的方向作为响应。迷宫的每个片段由三行组成,每行包含三个字符:Thor 所在的迷宫方格及其周围环境。

如果程序确定 Thor 已经走出了迷宫并站在出口处,则应直接正常终止。否则,它必须打印一行包含 Thor 下一步的方向:“N”表示向北走(地图上方),“W”表示向西走(地图左方),“S”表示向南走(地图下方),或“E”表示向东走(地图右方)。之后,程序应刷新输出缓冲区:例如,在 C 或 C++ 中调用 fflush(stdout),在 Java 中调用 System.out.flush(),或在 Python 中调用 sys.stdout.flush()

如果通道畅通,Thor 会向请求的方向移动到相邻方格,并获得他此时看到的下一个迷宫片段。如果请求的方向上有墙,则过程以 “Wrong Answer” 结果终止。

如果 Thor 在站在出口时正常终止,并且在此之前最多走了 6000 步,则程序通过该迷宫。

样例

在每个测试点上,第二次运行的输入取决于程序在第一次运行时的输出。在样例中,我们将考虑一种通过简单地打印所需步骤序列来形成提示的程序:0 表示向东走,1 表示向北走。当然,这种程序并不总是有效。

该程序在第一个测试点上的两次运行如下所示。在第二次运行中,添加了空行以显示事件序列。

样例 1

view
5
###########
#.#.......#
#.###.#####
#.#.....#.#
#.#.###.#.#
#...#.....#
###.#######
#.........#
###.#######
#.........#
###########
10001011
walk
10001011
5
###
#..
###

#.#
...
###

#.#
...
#.#

#.#
..#
#.#

###
#..
#.#

#.#
...
###

###
...
#.#

###
...
###

###
..#
###
E
N
N
N
E
N
E
E

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.