題目連結:1143 - 4.靈犬尋寶 | TIOJ INFOR Online Judge
題目敘述
正方形(左下角座標為(0,0),右上角座標為(99,99))的格網上,有一隻靈犬要尋找一個寶物,格網上除了靈犬與寶物之外,還有一些障礙物。一般情況下,只要不超出格網的邊界,靈犬的每一步最多有 8 個方向可供選擇,如圖一;但是必須注意,只有在 A 點沒有障礙物時才可以選擇方向 1 或方向 2,只有在 B 點沒有障礙物時才可以選擇方向 3 或方向 4,只有在 C 點沒有障礙物時才可以選擇方向 5 或方向 6,只有在 D 點沒有障礙物時才可以選擇方向 7 或方向 8。如果靈犬可以從出發的位置走到寶物的位置,其總共使用的步數,理論上應有一個最小值;但是靈犬也有可能無法走到寶物的位置。過程中,靈犬不可以走到障礙物的位置上。
以圖二為例,有多達 4 個障礙物介於靈犬與寶物之間,但是靈犬最快只要 2 步就可以到達寶物的位置。圖三是另一個例子,靈犬的位置靠近角落,雖然只有 2 個障礙物,靈犬卻無法到達寶物的位置。
請撰寫一個程式,若靈犬可以從最初位置走到寶物的位置時,請列印出其使用之最少步數;若靈犬無法到達寶物的位置,請列印出單字 “\(impossible\)”。
輸入說明
第一行為一個整數 \(n\),代表障礙物的個數,\(0 \le n \le 1000\)。接下來的\(n\)行,每行表示一個障礙物的座標,其橫座標值與縱座標值間以一個空白隔開。 再下來的一行,表示靈犬的最初位置,其橫座標值與縱座標值間以一個空白隔開。 最後一行,代表寶物的位置,其橫座標值與縱座標值間以一個空白隔開。 注意:輸入之障礙物、靈犬、寶物皆在不同位置。所有橫、縱座標值均為介於 \(0\)(含)至\(99(含)\) 之間的整數。
輸出說明
依行走之規則,若靈犬可以從其位置走到寶物的位置時,請列印出其使用之最少步數;若靈犬無法到達寶物的位置,請列印出單字 “\(impossible\)”。
範例輸入 1
1 | 4 |
範例輸出 1
1 | 2 |
範例輸入 2
1 | 2 |
範例輸出 2
1 | impossible |
題解
這很明顯是圖的 BFS,而為何不是 DFS 呢?因為題目要求輸出最短的路徑,而在 DFS 的時候,只要下一步能走就一直走,因此不一定會是最短路徑。
在 BFS 時,要先判斷座標是否存在,再看是否會被阻擋,以及是否已經到過,最後還有目標位置有無障礙物。若以上條件均通過才能將他推入佇列。
實作程式碼如下
1 |
|