【複習記錄】BFS

BFS告一段落。
去年暑假剛接觸的時候還不知道隊列是什麼,所以覺得好難。之後BFS好像一直被定位在一個比較水的層次上吧,在一堆高級算法之間顯得不是那麼重要。
所以停課前對BFS的認知還停留在那棵樹上……
就是這樣:
這裏寫圖片描述
一層一層搜。

停課之後斷斷續續從迷宮開始,每道題都耗時很久,簡單些的常常一眼切,然後因爲輸入以及其它各種智障錯誤一直跑不出來。平均速度一天一兩道題吧,弱得不行。

最近做過的題:

※迷宮/地圖

POJ 3984 迷宮問題

雖然是入門題,也是搞了很久。
第一次使用dx[]={0,1,0,-1},dy[]={1,0,-1,0}來模擬四個方向的移動。
“輸出的方式賊有意思”
是啊是啊。過幾天再打一遍。
當時沒有想明白爲什麼這樣找出來的路線就是最短的,後來慢慢理解它是一層一層入隊,每次搜把一層所有情況都考慮到了,所以一旦到達終點就必然是最早到達。

codevs 1215 迷宮

平常做題一直沒留意,做這個的時候才知道單個字符只能用單引號表示,字符串要用雙引號表示。然後就是簡單的最原始的寬搜~當時居然妄想把字符數組初始化@#@¥@#@#!@#%¥……%&……*

codevs 2806 紅與黑

水題……弄了好久……卡在輸入上……
這個題有點小坑,行數和列數反過來說……

codevs 1026 逃跑的拉爾夫

無限心酸。
題目要求找出所有可能的終點,所以走過的點可能再走,於是不能再用簡單的二維數組判重,需要再加一維表示方向數,含義是在給出的第幾個方向上走到了這個點,以相同的步驟走到過當前點,則不再入隊。最後統計在最後一個步驟到達的所有點,即爲答案。

codevs 1902 刺殺大使(BFS+二分)
挺好的題。

codevs 1536 海戰
統計地圖中方塊的個數,還要判斷是否有兩個方塊接起來並且組不成一個新的方塊的不合法的情況。接觸的情況一共有四種,挨個判斷就好,好像沒什麼機智的方法。

codevs 1537 血色先鋒隊

挺有意思的。成功剪枝的實例。體現了BFS的特點。
一直RE是因爲開了個很小的數組。。。
以後做題應當反覆檢查數據範圍,數組大小,反覆檢查!
判重判的是在當前這次的擴展中是否走到過。

codevs 1411 武士風度的牛

死循環會導致MLE!!而且過了樣例……於是放心交了……
過樣例的時候勿狂喜。反覆檢查有沒有可能導致死循的智障錯誤,比如判重不全面,判重的元素放錯……防不勝防。

↑以上套路基本一樣:
點入隊,更新相關的所有點,出隊,相關點入隊,判重。

接下來,,,關於串

※字符串的轉換

codevs 1099 字串變換
這個可以用雙向BFS做。
雙向BFS跑得快~可是太難調了……先學會,,然後能不用就不用吧。
雙向BFS適用於已知初始狀態和目標狀態,然後分別作爲BFS的起點,也就是從兩頭開始搜。又是由於每次都是搜一層,所以如果題目有解,則中間必然會相遇。有一個點一直過不了QWQ……

放進隊列中的是字符串,所以是queue<>q;括號裏寫string

※局面

codevs 1004 四子連棋
出現了奇怪的錯誤。
需要用到hash判重。三進制轉化爲十進制。
amzing,放到隊列裏的居然是整個局面。包括兩個空格的位置,步數,上一步走的是黑棋還是白棋甚至整個棋盤也可以存進去。強大強大。

昨天考試最後一題好像跟這個類似,試着打了一下,跑不出來QWQ。
…………
…………
…………

※亂七八糟的BFS

codevs 1506傳話
算是BFS的應用吧


綜上。

①:BFS一定會有判重的過程,也許一個點會重複走,也許判重不只判座標(逃跑的拉爾夫)但必須判重;
②:要相信結構體可以存下整個世界……
③:做任何題都要檢查好數據範圍,數組大小;
④:關於迷宮/地圖的讀入;
⑤:BFS有時不是很水啊……

發佈了150 篇原創文章 · 獲贊 6 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章