QOJ.ac

QOJ

Limite de temps : 1.0 s Limite de mémoire : 256 MB Points totaux : 100

#18544. 森林入面嘅迷宮

Statistiques

喺呢道互動題入面,你要用唔太多時間,由一個未知迷宮嘅入口行到出口。

著名戰士 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.