廣度優先搜尋演算法詳解

2021-08-20 18:04:39 字數 1963 閱讀 6265

說到廣度優先搜尋,大家可能先想到的是廣度優先遍歷,其實廣度優先搜尋就是利用了廣度優先遍歷的一種搜尋演算法。我個人總結的該演算法包含以下幾個關鍵點,掌握了這幾個點,該演算法也就掌握的很好了。下面也基本上是圍繞這幾個關鍵點展開的。

1.狀態

2.狀態轉移方式

3.有效狀態

4.佇列

5.標記

我們先來看看一點有意思的吧!

說有一天公主被大魔王抓了,關進了乙個迷宮裡,需要你這位勇士去營救(當然成功了就自然是公升職加薪贏取白富美啦),這個迷宮以二維陣列的形式給出(暫定為5*5的迷宮)例:

[    0 1 0 0 0

0 1 0 1 0

0 0 0 0 0

0 1 1 1 0

0 0 0 1 0    ]

其中0表示這裡可以走,1表示這裡是堵牆不能走,每次只能往上下左右四個方向走乙個單位,迷宮入口為左上角,而公主在最右下角,問你是否能找到一條最短的路徑成功救出公主,如果能輸出其路徑(每乙個路徑以座標形式給出,如(0,0)),不能輸出-1。

當看到什麼最短時間啦,最短路徑啦(當然不是圖那種最短路徑),這就適合用廣度優先遍歷。廣度優先遍歷其實是對狀態的一種遍歷,這裡就要搞清楚什麼是狀態。我們先自己想一下,你看到這道題會有什麼樣的想法,從第乙個點出發,可以往右、下走,然後如果往右走,又會延伸出往右、下走,我們用一棵樹來表示((1,2,3)表示x=1,y=2,路徑長度也可以叫時間為3)

這裡我們便可以看到乙個點加上乙個時間t便構成了乙個所謂的狀態,而我們廣度優先搜素就是要按層,一層一層地搜尋這些狀態,直到找到要求狀態為止。上面的圖我們還應該修改修改,因為,第二次到達的點所需要的時間肯定比第一次到達所需要的時間多,如上圖的(0,0,3),所以,我們設定乙個標記,凡是我們到達過的點,便不進行第二次的搜尋與延伸,此之謂剪枝,這樣一來狀態的總數便等於a*b(a為總行數,b為總列數),只要這個時間複雜度在我們的接受範圍之內,我們便可以採用廣度優先搜尋。

狀態轉移呢,是指由乙個狀態可以延伸出其他哪些狀態,也就是可以往哪些地方走的問題。

說了這麼多,是時候上點乾貨了,我們看看**

#include#include#includeusing namespace std;

int migong[5][5];//儲存迷宮圖

bool flag[5][5];//標記改點是否到達過

class stat

;int r[4][2]=;//用於狀態擴充套件

stat* bfs()//返回終點狀態

q.push(temps);//將新狀態加入佇列中

flag[x][y] = true;//標記該狀態已經到達過

}} return start;

}int main()

} stat* p = bfs();

stacks;//放入棧中,主要是為了讓其反序,不然從目標狀態找其父節點遍歷的話,是反的

while(p != null)

while(s.empty() == false)

{ stat* temp = s.top();

s.pop();

cout<

我們來看看結果

最後,大家一定要記住我踩過的坑(在函式內定義物件時,如果在以後還要用到的話,一定要用new關鍵字分配記憶體於堆中)

ps: 這是我第一次寫部落格,諸多問題,還請大家指出,海涵。

廣度優先搜尋演算法

廣度優先搜尋 bfs 這個是第乙個研究的課題,廣度優先搜尋也叫寬度優先搜尋,英文為breadth first searth,開始看的時候一頭霧水,基本也能懂大致意思,但是還不是真正的理解,今天又仔細看看,大致理解上又更深了一層吧。下面來總結下,自己的一些體會,以及對它的獨到的理解。大的方面來說它是一...

廣度優先搜尋演算法

在深度優先搜尋中,深度越大的結點越先得到擴充套件。如果把它改為深度越小的結點越先得到擴充套件,就是廣度優先搜尋法。廣度優先搜尋演算法的基本思想 1 建立乙個空的狀態佇列ss 2 建立乙個空的狀態庫sb 3 把初始狀態s 0 存入佇列ss中 4 若佇列狀態是目標狀態,則搜尋成功,演算法執行中止。如該狀...

廣度優先搜尋演算法

看了下廣度優先搜尋演算法得定義為從乙個頂點開始,找到最短路勁,歸結為一種連通圖得遍歷策略 如果我們要求v0到v6的一條最短路 假設走乙個節點按一步來算 注意 此處你可以選擇不看這段文字直接看圖3 1 我們明顯看出這條路徑就是v0 v2 v6,而不是v0 v3 v5 v6。先想想你自己剛剛是怎麼找到這...