在這道互動題中,你必須在不花費太多時間的情況下,從一座未知迷宮的入口走到出口。
著名戰士 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$ 步,仍未超過時間限制,卻也尚未抵達目標格子,評測會終止並給出「答案錯誤」的結果。
範例
說明
上圖顯示第一筆測試生成的迷宮。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
圖中以粗灰線表示這個解法。