首先需要說明的是BFS算法(廣度優先算法)本質上也是枚舉思想的一種體現,本身效率不是很高,當數據規模很小的時候還是可以一試的。其次很多人可能有這樣的疑問,使用搜索算法的時候,到底選用DFS還是BFS,博主覺得對於最短路搜索來說是都可以的,數據規模不大,廣搜解決最短路的效率要高一些,還有對於搜索過程中搜索的單位為1時,廣搜更合適。
這里總結一下BFS算法,DFS是一條路走到黑,不行再回退一步,直到所有的路都試一遍,而BFS則是需要有一種層的概念,每次走到一個狀態,將該層所有可能的情況都加入隊列,加入之前要記錄一下將自己從上層“繼承”來的狀態,直到某一個情況的狀態符合條件或者隊列拓展結束。
具體算法,先將一個起點加入隊列,將該點的下一個所有可能的情況都加入隊列,再按照加入隊列的順序,一一進行搜索。直到隊列為空或者符合條件而結束搜索。
下面上一道練習題:http://poj.org/problem?id=3278 這道題中的人可以有三種走法,一旦走到直接結束搜索,相對於DFS來說效率更高些。
下面上一道經典的迷宮問題:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2412這道題挺有意思的,也可以使用DFS來寫。
之前都是使用結構體數組模擬隊列操作,也可以使用C++STL中的隊列容器來寫。
繼續補充,對BFS算法理解更深刻的是有了層的概念之后,每一層的成員要記錄自己的狀態。
比如在最短路中每一層拓展的成員要記錄自己從上層“繼承”來的步數,以便到達目標的時候,知道自己走了多少步。比如這道題目(http://poj.org/problem?id=3278)。另外在“繼承”上層狀態的時候,當該層出現某個情況的某個狀態和同層的其他情況的狀態不一致的時候,注意考慮優先級的問題,因為本質上講,該層的所有情況都是同一級別的。比如這道題目(http://poj.org/problem?id=3278)。