廣度優先搜尋介紹

2022-10-11 07:57:12 字數 1865 閱讀 8206

這道題的原址:

bfs是一種盲目搜尋法,目的是系統地展開並檢查圖中的所有節點,以找尋結果。換句話說,它並不考慮結果的可能位置,徹底地搜尋整張圖,直到找到結果為止。bfs並不使用經驗法則演算法。

搜尋其實算一種暴力列舉的演算法,不過這種暴力列舉是一種有條理性的暴力列舉, 更容易控制以及實現。它在求最短路以及遍歷圖或樹的時候會用到。

說它是一種暴力列舉的演算法是因為,如同百科提到的,它在搜尋的時候仍然會遍歷整張圖中的所有節點,而它的條理性則體現在它用乙個佇列記錄每一步搜尋的狀態,每一步新加入的狀態都會加入佇列,用於下一次搜尋,並且狀態會被繼承。這種在圖上實現的搜尋不僅容易實現,也容易記錄每一步的狀態,用於求出答案(如最短路)。

建圖方式:

鄰接矩陣:二維陣列: a[x][y]。x表示橫座標,y表示縱座標,a[x][y]即代表這個點的狀態。

鄰接表: 指標陣列:

[cpp]view

plain

copy

struct

ljb  

*a[x];  

當題目所給的圖過大,橫縱座標的最大值超過二維陣列能開的空間時,可以使用鄰接表。a[x]代表每一行的頭結點。列和狀態用鍊錶的結點記錄,掛在對應行的頭結點之後。這樣可以存下乙個足夠大的圖,當然操作起來會更麻煩。 

用於下一步搜尋的next陣列:

[cpp]view

plain

copy

intnext[4][2]=, , , };  

每一行的值分別代表向上右下左走一步,這樣可以直接用一層for來實現向下一步搜尋。

如dx=x+next[i][0], dy=y+next[i][1];

另外雖然是列舉,但是已經走過點應當避免重複列舉,所有用乙個book[x][y]陣列記錄該點是否已經走過。

下面通過乙個簡單的用bfs求解的問題來講解

題目:給出乙個長為n寬m的地圖,起點x,y和終點sx,sy,以及m個障礙物(不能經過的點),問從起點到終點最少需要經過多少步數。

關於bfs的用法就在**中具體述說了:

[cpp]view

plain

copy

#include 

#include 

using

namespace

std;  

const

intmaxn=1e3+5;  

bool

book[maxn][maxn]; 

//記錄是否已經走過這個點

intt[maxn][maxn]; 

//鄰接矩陣

intn,m;  

intnext[4][2]=, , , };  

struct

p  a[maxn];//用佇列記錄將要搜尋的點

intbfs(

intx, 

inty, 

intsx, 

intsy)  

intdx, dy; 

//表示當前的點能夠走的點的座標

for(i=0; i<4; i++) 

//列舉四個可以走的方向

}   

head++;//讓已經搜尋過的點出隊,容易忘記

}  return

-1; 

// 假如隊列為空,即所有的點都已經搜尋過了,但是並沒有函式return結束,說明沒能找到目標點,則返回-1表示不能到達

}  int

main()  

intans=bfs(x,y,sx,sy);  

printf("%d\n"

, ans);  

return

0;  

}  

搜尋 廣度優先搜尋

廣度優先搜尋一層一層地進行遍歷,每層遍歷都是以上一層遍歷的結果作為起點,遍歷乙個距離能訪問到的所有節點。需要注意的是,遍歷過的節點不能再次被遍歷。class solution,int shortestpathbinarymatrix vectorint grid length return 1 cl...

廣度優先搜尋

include include include include using namespace std struct node 圖頂點結構定義 typedef struct node graph 圖形的結構新型態 struct node head 9 圖形頂點陣列 int visited 9 遍歷標...

廣度優先搜尋

廣度優先搜尋詳解 1.也稱寬度優先搜尋,顧名思義,就是將一棵樹一層一層往下搜。演算法首先搜尋和s距離為k的所有頂點,然後再去搜尋和s距離為k l的其他頂點。bfs是一種完備策略,即只要問題有解,它就一定可以找到解。並且,廣度優先搜尋找到的解,還一定是路徑最短的解。但是它盲目性較大,尤其是當目標節點距...