前面有對dfs的介紹以及實例分析,這次對廣度優先算法(bfs)進行介紹以及相關實例,首先總結一下dfs和bfs的區別:
1)廣度優先搜索算法(Breadth-First-Search,縮寫爲 BFS),是一種利用隊列實現的搜索算法。簡單來說,其搜索過程和 “湖面丟進一塊石頭激起層層漣漪” 類似。
2)深度優先搜索算法(Depth-First-Search,縮寫爲 DFS),是一種利用遞歸實現的搜索算法。簡單來說,其搜索過程和 “不撞南牆不回頭” 類似。
實例還是迷宮搜救:
問題描述:A處於迷宮的入口處(1,1),B在(p,q)。找從(1,1)到(p,q)的最短路徑(步長),如圖:
輸入描述:
整數n m:分別代表迷宮的行和列;
a[n][m]:用1表示有障礙,0表示無障礙;
start end p q:分別代表起始座標和終點座標;
輸出描述:
整數step 最短步長
例如:
輸入:
4 4
0 0 0 0
0 1 0 0
0 0 0 1
1 0 0 0
1 1 4 2
輸出:
4
代碼(c/c++):
#include <iostream>
#include <queue>
using namespace std;
const int MAX_N = 100;
const int MAX_M = 100;
const int INF = 0x3f3f3f3f;
typedef pair<int, int> P;
int maze[MAX_N][MAX_M + 1];
int N, M;
int sx, sy; //起點的位置
int gx, gy; //終點的位置
int d[MAX_N][MAX_M];//儲存起點到某一點的距離
int dx[4] = { 1,0,-1,0 }, dy[4] = { 0,1,0,-1 }; //表明每次x和y方向的位移
void bfs()
{
queue<P> que;
for (int i = 1; i <= N; i++)
for (int j = 1; j <= M; j++)
d[i][j] = INF; //初始化所有點的距離爲INF
que.push(P(sx, sy));
d[sx][sy] = 0; //從起點出發將距離設爲0,並放入隊列首端
while(que.size()){
P p = que.front();
que.pop(); //彈出隊首元素
int i;
for(i=0;i<4;i++){
int nx = p.first + dx[i];
int ny = p.second + dy[i];
if(nx>=1&&nx<=N&&ny>=1&&ny<=M&&maze[nx][ny]!=1&&d[nx][ny]==INF){
que.push(P(nx, ny));
d[nx][ny] = d[p.first][p.second] + 1;
if(nx==gx && ny==gy)
break;
}
}
if(i!=4)
break;
}
}
int main()
{
cin>>N>>M;
for(int i=1;i<=N;i++){
for(int j=1;j<=M;j++)
cin>>maze[i][j];
}
cin>>sx>>sy>>gx>>gy;
bfs();
cout<<d[gx][gy]<<endl;
return 0;
}