BFS的个人理解和相关例题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40315987/article/details/79964595

宽度优先搜索(BFS):

    是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。

简单来说:就是每走一步都要把所有的下一步的所有可能都遍历一下,然后把错误的路口直接PASS。

例如下面的迷宫图片:绿色的为正确道路。在从起点走的每一步都需要判断!如果遇到强(黑色方块),这接PASS。而如果用BFS的话它会一条路走到底,再去判断,然后一个一个尝试。

一句话:DFS是一条线一条线的测试,BFS是直接从一个点四面八方的扩散测试。

(BFS在比赛中一般都是迷宫问题,去找通往终点的一条路)

              

例题:

        给定一个大小为M 的迷宫。迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四格的通道移动。请求从起点到终点所需要的最小步数。请注意,本题假定从起点一定可以移动到终点。

第一行输入N和M,接下来输入M  的迷宫地图(‘#’为墙壁,‘.’为通道,‘S’为起点,'G'为重点)

输出最短路径的长度。

(限制条件:N , M <=100)


代码:

#define MAX_N 100
#define INF -1
typedef pair<int,int> P;

int N,M;
int Sx,Sy;	// 开始节点
int Ex,Ey;	// 结束节点
char Map[MAX_N][MAX_N];
int Ans[MAX_N][MAX_N];
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};

int Solve()
{
	queue<P> data;
	while(!data.empty())
		data.pop();

	// 初始化数据
	for(int i =0;i<N;i++)
		for(int j=0;j<M;j++)
			Ans[i][j] = INF;
	data.push(P(Sx,Sy));
	Ans[Sx][Sy] = 0;

	while(!data.empty())
	{
		P Temp = data.front();
		data.pop();
		// 判断是否走到出口
		if(Ex == Temp.first && Ey == Temp.second)
			break;
		for(int i=0;i<4;i++)
		{
			int Nx = Temp.first + dx[i];
			int Ny = Temp.second + dy[i];

			if(Ans[Nx][Ny] == INF && Map[Nx][Ny] != '#' && Nx>=0 && Nx<N && Ny>=0 && Ny<M)
			{
				data.push(P(Nx,Ny));
				Ans[Nx][Ny] = Ans[Temp.first][Temp.second] + 1;
			}
		}
	}
	return Ans[Ex][Ey];
}

结果:


测试数据:

10 10
#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#

有不好的地方希望提出,谢谢。共同学习~

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页