《面试准备》广度优先算法(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;
}

测试: 

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