1. 程式人生 > 其它 >bfs(走迷宮)

bfs(走迷宮)

bfs是寬搜,可以用來求邊權是1的最短路,先上例題吧

給定一個 n×mn×m 的二維整數陣列,用來表示一個迷宮,陣列中只包含 00 或 11,其中 00 表示可以走的路,11 表示不可通過的牆壁。

最初,有一個人位於左上角 (1,1)(1,1) 處,已知該人每次可以向上、下、左、右任意一個方向移動一個位置。

請問,該人從左上角移動至右下角 (n,m)(n,m) 處,至少需要移動多少次。

資料保證 (1,1)(1,1) 處和 (n,m)(n,m) 處的數字為 00,且一定至少存在一條通路。

輸入格式

第一行包含兩個整數 nn 和 mm。

接下來 nn 行,每行包含 mm 個整數(00 或 11),表示完整的二維陣列迷宮。

輸出格式

輸出一個整數,表示從左上角移動至右下角的最少移動次數。

資料範圍

1n,m1001≤n,m≤100

輸入樣例:

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

輸出樣例:

8
這個邊權是1,很經典的一個bfs的題目

 

 

 

這個就是具體的一個寬搜的一個過程,由過程也可知,只要先搜到終點的那個路徑一定是最短的,注意這句話有兩個關鍵詞:①能搜到②先搜到

只有滿足這兩個條件才是我們需要的最短路徑,這個過程可以用佇列來模擬,因為先搜過的點用過了,就可以不再用了,屬於佇列的先進先出的一個原則,就可以用佇列來實現

#include<iostream>
#include
<algorithm> #include<cstring> #include<queue> using namespace std; typedef pair<int,int> PAII; const int N=200; int g[N][N],d[N][N];//g存的是地圖,d代表到起點所搜尋的距離 int n,m; int bfs() { queue<PAII> q;//用佇列來實現寬搜的操作 memset(d,-1,sizeof(d));//所有的點都沒有被搜過,就都賦值為-1 q.push({0,0});//從0開始; d[0
][0]=0;//初始化 while(q.size())// { auto t=q.front(); q.pop(); int dx[4]={-1,1,0,0};//實現上下左右遍歷 int dy[4]={0,0,1,-1}; for(int i=0;i<4;i++) { int x=t.first+dx[i],y=t.second+dy[i];//遍歷到新的點左邊 if(x>=0&&y>=0&&x<n&&y<m&&d[x][y]==-1&&g[x][y]==0) { d[x][y]=d[t.first][t.second]+1;//序號+1 q.push({x,y});//把新的遍歷且符合要求的點存入佇列 } } } return d[n-1][m-1]; } int main(){ cin>>n>>m; for(int i=0;i<n;i++) for(int j=0;j<m;j++) cin>>g[i][j]; cout<<bfs()<<endl; return 0; }