《面試準備》廣度優先算法(bfs)介紹以及相關實例(c/c++)

前面有對dfs的介紹以及實例分析,這次對廣度優先算法(bfs)進行介紹以及相關實例,首先總結一下dfs和bfs的區別:

1)廣度優先搜索算法(Breadth-First-Search,縮寫爲 BFS),是一種利用隊列實現的搜索算法。簡單來說,其搜索過程和 “湖面丟進一塊石頭激起層層漣漪” 類似。

ç®æ³åºç¡ï¼BFSåDFSçç´è§è§£é

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;
}

測試: 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章