1. 程式人生 > >BFS+DFS演算法小總結

BFS+DFS演算法小總結

(先說明,這篇部落格記載了一些比較水的,入門的搜尋,如果想找高階點的,這篇可能會讓各位失望的喔!~待啥時候這篇部落格寫豐富了再把這句話刪了)

這個周做了一部分簡單搜尋題,感覺自己學到了好多,雖然是簡單搜尋,但是我也是感覺到裡邊的一些題好難啊,對於搜尋,之前看講解視訊的時候,我覺的一句話說的特別對:搜尋就是當你處在現在這個狀態的時候,下一個狀態是什麼。下邊說說做的題吧:

Bfs:

1.迷宮問題

這個題可以說的上是廣搜裡面最經典的一道入門題目了,個人覺得這個例題很好地表現了廣度優先搜尋是如何與佇列先進先出(FIFO)的思想聯絡起來的,通過不斷取得某個狀態後能夠達到的所有狀態並將其加入佇列, 並且由於佇列本身的特性先加入佇列的狀態總是先得到處理,這樣就達到了一個目的:總是先將需要轉移次數更少的狀態進行分析處理,換句話說就是總是取得了這個狀態的樹中更接近根部的節點,又或者是總是讓搜尋樹的廣度得到儘可能增加。

2.POJ 3278 Catch That Cow

這個題思路比較簡單,所以寫的時候也比較好寫,適合新手拿來練手,增加自信。

3.POJ 3984 迷宮問題

這道題也是一道比較好的模板題吧,在原本走迷宮的基礎上還要記錄路徑,其實在演算法實現上也比較簡單,只需要在結構體裡再定義一個變數來記錄當前位置的前一個位置,等到了終點以後再把位置逆序輸出就好了。

4.POJ 2251 Dungeon Master(三維BFS)

題目看起來很厲害,實際上看懂了並不難,開一個三維的陣列,這裡需要注意的是第一維是高度,然後就是簡單的BFS了,還有不同就是三維的時候有六個方向可以走,平常我們做廣搜題是四個方向,在前後左右的基礎上多了一個向上和向下的走法,還有一個問題就是多個輸入樣例要注意每次都要初始化,我做的時候就因為這個WA了好幾次,最後在學姐的幫助下才改出來

5.UVA - 11624 Fire!(雙層BFS)

一開始做的時候感覺好厲害,其實就是用兩遍BFS,第一次先把火燒到地圖上的每個地方的時間算出來,就是先把地圖處理一遍,然後就是走迷宮問題了。

6.HDU 2612 Find a way(雙層BFS)

這道題也是用兩遍BFS,先把地圖處理了,然後把兩個人的路程加起來找最小就好了。

Dfs:

1.HDU 1241 Oil Deposits

我覺得這個題是比較能夠體現出深搜的思想了:從最開始的狀態出發,遍歷所有可以到達的狀態。適合初學者來增加對深搜的理解。

2.POJ 2386 Lake Counting

模板題,基本上和上邊的題是一樣的。

3.POJ 1164 The Castle

大概也算的上是模板題,然後在這個基礎上又算合併出的最大的塊有多少小塊。

4.POJ 1321 棋盤問題

在一個給定形狀的棋盤(形狀可能是不規則的)上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列。一個一個的放棋子,搜尋所有滿足題意的狀態。