QOJ.ac

QOJ

Límite de tiempo: 1.0 s Límite de memoria: 256 MB Puntuación total: 100

#18544. 森林中的迷宮

Estadísticas

在這道互動題中,你必須在不花費太多時間的情況下,從一座未知迷宮的入口走到出口。

著名戰士 Malcolm,也就是 Arcania 的英雄,在夜間穿越一片漆黑的森林。他走了很久,開始覺得自己迷路了,卻突然在路上撞見一堵石牆。落葉下隱約可見的石板標記清楚表明,他發現的是一座矮人建造的迷宮。

英雄對森林和其中生長的樹木所知甚少。好在他曾長時間與矮人相處,因此現在只要看迷宮上的標記,就能知道許多關於迷宮的資訊。

這座迷宮的標記組成了字元「SK3」。「S」表示迷宮是正方形,也就是說,迷宮的地面由 $n \times n$ 個大小為 $1 \times 1$ 公尺的正方形格子組成。這些格子周圍有一圈薄而完整的牆,牆上有兩個開口。第一個是英雄目前所在位置附近的入口,位於迷宮西南角格子的南側牆上。第二個開口是出口,位於迷宮東北角格子的北側牆上。

迷宮中共用一條邊的兩個格子,可能由通道連接,也可能被一段長一公尺的薄內牆隔開。只要兩格之間沒有牆,就能從一格移動到與它共邊的另一格。此外,可以自由穿過出口。入口只會開放到英雄踏入迷宮為止。之後入口會立即關閉,直到英雄安全抵達出口才會再次打開。

「K3」告訴有經驗的迷宮行者,迷宮具有以下結構。首先,從所有可能的薄內牆段中(南北方向共有 $n \times (n-1)$ 段,東西方向也有同樣多段),隨機選出三分之一(不是整數時向下取整),並以一個隨機確定的順序考慮。接著依此順序把牆段放入迷宮。如果某段牆放入後會把迷宮所在的正方形分成不連通的部分,就捨棄這段牆(不放置)。因此,保證生成的迷宮連通。

Malcolm 高興了起來:他對迷宮已經知道這麼多,肯定能抵達出口。他的目標是從入口旁的森林格子出發,走到出口旁的森林格子。此外,他必須抓緊時間:足夠快地從入口走到出口的人,就能看見藏在出口附近森林裡的寶藏。當然,前提是還沒有人先找到寶藏。

仔細一想,仍有值得擔心的事。首先,Malcolm 不知道迷宮的大小:正方形邊長 $n$ 可以是 $10$ 到 $200$ 公尺之間的任意整數。其次,迷宮和周圍森林一樣漆黑,因此 Malcolm 幾乎只能摸黑移動。每一步開始時,英雄會選擇北、東、南、西四個主要方向之一,然後嘗試往該方向移動一公尺。如果撞上障礙,他就留在原地;否則,他會移動到該方向相鄰的格子。每一步所需的時間與結果無關,因此重要的是總步數。

請幫助英雄移動,讓他夠快地抵達目標格子。如果英雄走了至多 $5 \cdot n + 300$ 步,並且抵達迷宮出口外的格子,你的解法就會被視為正確。

互動

在本題中,評測程式會回應你的程式寫入標準輸出的指令。每個指令決定 Malcolm 的下一步。每個指令獨占一行,由一個大寫英文字母組成:「N」表示向北走,「E」表示向東走,「S」表示向南走,「W」表示向西走。

對於每個指令,評測程式會立即向你的程式的標準輸入傳回一行,其中包含一個小寫英文單字:「no」表示通路被障礙阻擋;「ok」表示成功移動,但英雄尚未抵達目標格子;「end」表示成功移動,且英雄已抵達目標格子。收到「end」後,你的程式必須終止,不得再輸出任何內容。

為了避免輸出緩衝,每次發出指令後都必須清空輸出緩衝區。例如,C 或 C++ 可以使用 fflush (stdout),Java 可以使用 System.out.flush (),Pascal 可以使用 flush (output),Python 可以使用 sys.stdout.flush ()。

每筆測試中的迷宮都會在隨機生成後預先固定。

如果程式已經走了至少 $100\,000$ 步,仍未超過時間限制,卻也尚未抵達目標格子,評測會終止並給出「答案錯誤」的結果。

範例

problem_18544_f7a481a2ccb59afa9287748309560346.png

說明

上圖顯示第一筆測試生成的迷宮。Malcolm 從圓圈標記的格子出發,必須抵達叉號標記的格子。例如,可以使用下列指令序列通過這座迷宮(指令下方為執行結果):

N W N E N W N E N E E E S E E N N N N N E N E S E E N
ok no ok ok ok ok ok ok ok ok ok no ok ok ok ok ok ok ok ok ok ok ok no ok ok end

圖中以粗灰線表示這個解法。

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.