C++之廣度優先搜索算法篇


C++之

廣度優先搜索算法篇                           

   廣度優先搜索(又稱寬度優先搜索算法)是最簡便的圖的搜索算法之一,這一算法也是很多重要的圖的算法的原型。   Dijkstra單源最短路徑算法和Prim最小生成樹算法都采用了和寬度優先搜索類似的思想。其別名又叫BFS,屬於一種盲目搜尋法,目的是系統地展開並檢查圖中的所有節點,以找尋結果。換句話說,它並不考慮結果的可能位置,徹底地搜索整張圖,直到找到結果為止。                                                                                            

    廣度優先算在全書中也算厲害了,在我的私人定制的“NOI BOSS表”中也屬NO.2了,它和深搜不同,廣搜相對來說可以求出最短路徑,但就是時間復雜度略有差別。                                                    

看了下面這張表格可以了解廣搜與深搜的對比,也就可以看出兩者的優劣和

主要區別
                             主要區別
遍歷方式
深度優先搜索遍歷
廣度優先搜索遍歷
所用數據結構
隊列
一般優化
最優性剪枝
可行性剪枝
Hash判重
雙向搜索

。                                     

                                                                                                       

 

廣搜的核心思想就是:從初始結點開始,產生第一層節點,檢查目標結點是否在這些后繼結點之中,沒有,就擴展第一層節點,若沒有,用產生式規則得到第二層節點;檢查目標結點是否在這些后繼結點之中,沒有,就擴展第 二層節點……像這樣以此擴展節點、檢查,直到發現目標結點為止。

廣度優先搜索算法如下:(用 QUEUE

(1) 把初始節點S0放入Open表中;
(2) 如果Open表為空,則問題無解,失敗退出;
(3) 把Open表的第一個節點取出放入Closed表,並記該節點為n;
(4) 考察節點n是否為目標節點。若是,則得到問題的解,成功退出;
(5) 若節點n不可擴展,則轉第(2)步;
(6) 擴展節點n,將其子節點放入Open表的尾部,並為每一個子節點設置指向父節點的指針,然后轉第(2)步。

廣搜的算法描述大體框架:

int bfs() { 初始化,初始狀態存入隊列; int head=0,tail=1;//head為首指針,tail為尾指針。 do {   指針head后移一位,指向待擴展結點;   for(int i=1;i<=max;++i)   {    if(子結點符合條件)    {     tail指針增1,把新結點存入隊尾;     if(新結點與原已產生的結點重復)刪去該結點(取消入隊,tail減1);     else         if(新結點是目標結點)輸出並推出;    }   } } while(head<tail);//隊列為空 }

廣搜的應用:

(1)題目:黑白棋游戲
黑白棋游戲的棋盤由4×4方格 陣列 構成。棋盤的每一方格中放有1枚棋子,共有8枚白棋子和8枚黑棋子。這16枚棋子的每一種放置方案都構成一個游戲狀態。在棋盤上擁有1條公共邊的2個方格稱為相鄰方格。一個方格最多可有4個相鄰方格。在玩黑白棋游戲時,每一步可將任何2個相鄰方格中棋子互換位置。對於給定的初始游戲狀態和目標游戲狀態,編程計算從初始游戲狀態變化到目標游戲狀態的最短着棋序列。
(2)分析
這題我們可以想到用 深度優先搜索 來做,但是如果下一步出現了以前的狀態怎么辦?直接判斷 時間復雜度 的可能會有點大,這題的最優解法是用 廣度優先搜索 來做。我們就可以有初始狀態按照廣度優先搜索遍歷來擴展每一個點,這樣到達目標狀態的步數一定是最優的(步數的增加時單調的)。但問題是如果出現了重復的情況我們就必須要判重,但是朴素的判重是可以達到狀態數級別的。
           廣搜就說到這里,不足之處,請各位諒解。
續堯推廣:http://blog.sina.com.cn/s/blog_14c9fb2d20102vrn8.html
        http://a1458814497.blog.163.com/blog/static/250788009201561155050209/
        http://noipjnjxcjzx391701.blog.163.com/blog/static/25080703320156111304738
                                                    濟南市稼軒中學
                                                    39級10班  續堯


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM