這道題的原址:
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是一種完備策略,即只要問題有解,它就一定可以找到解。並且,廣度優先搜尋找到的解,還一定是路徑最短的解。但是它盲目性較大,尤其是當目標節點距...