切換
舊版
前往
大廳
主題

ZeroJudge - b571: 不要慌,這是孔明的陷阱! 解題心得

Not In My Back Yard | 2019-06-25 23:00:15 | 巴幣 0 | 人氣 237

題目連結:


題目大意:
給定兩正整數 n 、 m (1 ≦ n 、 m ≦ 500),代表接下來有 n 列輸入,且每列有 m 個字元,代表這個迷宮的地圖物件。每個字元可能是「#」、「.」或是大寫字母「A」「B」、「C」、「X」以及「Y」,分別代表牆壁、空地、 A 型陷阱、 B 型陷阱、 C 型陷阱、起點和終點。

每步只能往現在所在位置的上下左右移動一格。

一開始只有 A 型陷阱啟動,走一步換只有 B 型啟動,再走一步便換 C 型。接著的所有步數便按照「A → B → C → A」的循環模式。如果下一步走的地方之陷阱會啟動,則不能走到該格位置(當然牆壁也走不過去)。

求從起點到終點所需最少步數為何?如果不可能抵達輸出「-1」。



範例輸入:
3 10
##########
#X.CABC.Y#
##########


範例輸出:
9


解題思維:
條件稍作變化的廣度優先搜尋(BFS)的題目。

一般用 BFS 走迷宮,會從起點一步一步地慢慢擴散到可以走到的點(走過的點就不加入佇列(Queue)裡)。如果擴散到了終點,則當下的步數即是從起點到終點的最少步數。但如果從頭到尾都沒有終點出現過,則代表無法從起點走到終點。

而此題多了陷阱的要素,陷阱的啟動跟步數除以 3 的餘數有關。餘數為 0 為 A 型; 1 為 B 型; 2 為 C型 。

因此,我們要不要把將擴展到的點的加入佇列之條件之一,從原本的「有沒有走過」改為「有沒有存在上次的步數 % 3(取 3 餘數) = 現在步數 % 3 」。因為如果存在某次的步數 % 3 = 現在步數 % 3 ,代表接下來繼續走的話,只會重複之前做過的事情。

接著就跟一般走迷宮的方式一樣。有走到就輸出現在步數(視實作的情況可能會要 + 1);沒有就輸出「-1」。

此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作