1. 程式人生 > >寬度優先搜尋BFS(Breadth-First-Search)

寬度優先搜尋BFS(Breadth-First-Search)

Breadth-First-Search

1. 與DFS的異同

  相同點:搜尋所有可能的狀態。

  不同點:搜尋順序。

2. BFS總是先搜尋距離初始狀態近的狀態,它是按照:開始狀態->只需一次轉移就可到達的所有狀態->只需兩次轉移就可到達的所有狀態->……

對同一狀態只搜尋一次,因此複雜度為O(狀態數*轉移方式)。

3. DFS隱式地利用了棧,而BFS利用了佇列,搜尋時先將初始狀態入隊,此後出隊取出狀態,並把該狀態可轉移到的狀態中尚未訪問的狀態入隊,

重複上述過程,直到佇列為空或找到解。觀察佇列我們可以得知,所有狀態都是按距初始狀態由近及遠遍歷的。

下面給出經典例題:迷宮最短路徑

description: 
給定一個大小為N*M的迷宮。迷宮由通道和牆壁組成,每一步可以向鄰接的上下左右四格的通道移動。請求出從起點到終點所需的最小步數。請注意,本題假定從起點一定可以移動到終點。

樣例輸入輸出: 
輸入: 
這裡寫圖片描述
輸出: 
22

AC Code:

int INF=0x3f3f3f3f;
typedef pair<int,int> P;
int N,M,sx,sy,gx,gy; 
char maze[N][M];
int d[N][M];//記錄到各位置的最短距離 
int dx[4]={1,0,-1,0},dy={0,1,0,-1};
int bfs(){ queue<P> q; q.push(P(sx,sy)); memset(d,INF,sizeof(d)); d[sx][sy]=0; while(q.empty()){ P p=q.front(); q.pop(); if(p.first ==gx&&p.second ==gy) break; for(int i=0;i<4;i++){ int nx=P.first +dx[i],ny=P.second +dy[i];
if(nx>=0&&nx<N&&ny>=0&&ny<M&&maze[nx][ny]!='#'&&d[nx][ny]==INF){ q.push(P(nx,ny)); d[nx][ny]=d[p.first ][p.second]+1; } } } return d[gx][gy]; }