BFS的个人理解和相关例题

宽度优先搜索(BFS):

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

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

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

一句话: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#

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

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值