廣度搜尋bfs

2021-09-08 08:32:59 字數 2962 閱讀 5466

廣度搜尋在acm中應用十分廣泛,英文簡寫是bfs(breadth first search)。

下面先看一下例子:

在乙個4*4的矩形中,有一些位置設定有障礙,要求從(1,1)走到(4,4),求最短距離。

分析:假設沒有任何障礙,我們可以走的路線如下:

起點為(1,1),假設這一步是第一步可以到達的位置;然後它可以向相鄰的方向走一步,

如向右或向下就到達2號位置,2號就代表從起點到這個位置要走兩步;3又是2號走一步;

4是3走一步;這樣子就像從1號展開以水波,向四周擴散,我們只要把這些相鄰的位置

全部儲存在佇列中,就會遍歷完相鄰的區域。

下面通過乙個具體的例子講一下如何程式設計實現:

問題:南陽理工學院校園裡有一些小河和一些湖泊,現在,我們把它們通一看成水池,假設有一張我們學校的某處的地圖,這個地圖上僅標識了此處是否是水池,現在,你的任務來了,請用計算機算出該地圖中共有幾個水池。

輸入:第一行輸入乙個整數n,表示共有n組測試資料

每一組資料都是先輸入該地圖的行數m(0輸出:

輸出該地圖中水池的個數。

要注意,每個水池的旁邊(上下左右四個位置)如果還是水池的話的話,它們可以看做是同乙個水池。

下面是程式的源**:

#include#include

#include

using

namespace

std;

struct

point

;int dir[4][2]=,,,};//

分別表示向四個方向做一步

intmain()

;//全部沒有訪問過

int map[100][100

];

inti,j;

int count=0;//

水池個數

for(i=0;i)

for(j=0;j)

//for(j)

for(i=0;i)

for(j=0;j)

if(map[p2.x][p2.y]==1&&check[p2.x][p2.y]==false

)

}//for

}//while}//

if}//for(i)

cout

}return0;

}

注意:1:遍歷時要把相鄰的水池算成乙個,那麼就要向四個方向同步搜尋,設定乙個dir[4][2]陣列,

分別加上這個陣列的值,就代表了向四個方向的遍歷。

2:廣度搜尋的思想就是從乙個地方向四周搜,我們把這個中心放到佇列裡,然後把所有相鄰的

也同時加到佇列裡,並且訪問過的做個標記(check[i][j]=true),這樣就能確保全部遍歷。

問題2:亡命逃竄 

下面是源程式:

#include#include

using

namespace

std;

struct

unit

;unit maze[

51][51][51];//

存放路徑

struct

point

;int dir[6][3]=,,,,,};//

分別向六個方向搜尋

intmain()

bool reachdoor=false

;

bool outtime=false

;

point p1,p2;

queue

que;

//必然是一條連通的路,所以只要乙個節點進入佇列,就能遍歷所有的節點

int step=0

; p1.x=p1.y=p1.z=0

; maze[p1.x][p1.y][p1.z].step=0;//

兩個引數都在入隊的時候設定;沒有這一步就wrong

maze[p1.x][p1.y][p1.z].check=true

; que.push(p1);

while(!que.empty()&&!reachdoor&&!outtime)

if(p1.x==a-1&&p1.y==b-1&&p1.z==c-1)//

到門口

intm;

for(m=0;m<6;m++)

//if

if(!maze[p2.x][p2.y][p2.z].check&&maze[p2.x][p2.y][p2.z].step==0)//

沒有檢查且是路

}//for(m)

}//while(que)

if(reachdoor&&!outtime)

printf(

"%d\n

",step);

else

printf(

"-1\n

");

}//while(cnt--)

return0;

}

分析:(1)這個題程式設計立體形狀;需要向六個方向遍歷。

(2)不是像水池一樣,這題求最短路徑,因為有時間限制,所以只需要把乙個點入佇列,就可以

遍歷所有的節點。

(3)有關節點的資訊,如check,step都要在push之前設定,要不就會出錯。

(4)邏輯關係,如超時、到點終點、隊列為空,都是迴圈結束的條件,把這些條件放到外面,

內層只需要根據條件等級break,或者push。

BFS廣度優先搜尋

廣度優先搜尋,利用佇列實現,結束標誌是隊列為空的時候 承接dfs的演算法實現的講例,對於迷宮問題我們也可以採取廣度優先搜尋實現 include iostream include cstdio include cstdlib using namespace std int map 55 55 int ...

bfs廣度優先搜尋

這一課我們來學習圖的另一種遍歷方法 廣度優先搜尋 breadth first search,簡稱 bfs 這是一種連通圖的常用遍歷策略,通常用於求起點到各點的最短路徑,以及求兩點之間的最優路徑等問題。首先我們先來看看廣度優先搜尋的具體方法吧 對於乙個連通圖,我們假設一開始所有頂點均未被訪問,廣度優先...

廣度優先搜尋bfs

bfs即廣度優先搜尋演算法,其是搜尋演算法中的一種。1.dfs常用於尋找是否存在解 其從a節點出發,選取乙個臨近點b,然後不斷深入,在搜尋完b的下屬節點 ehif 後,回到a再搜尋臨近a的c節點,以此類推。2.bfs則用於在最短的時間或最少的移動距離內找到解 其往往從a節點出發,搜尋周圍所有的圍繞節...