BFS(宽度优先搜索)学习小结

宽度优先搜索
要学习宽度优先搜索,首先学习宽度优先遍历,从树的角度来说,就是一层一层的遍历,下面由实例说明在这里插入图片描述
这个图,用宽度优先遍历的结果就是1->2->3->4->5->6->7->8->9->10,如果用队列存储的话,就是12345678910,而宽度优先搜索,也就是一层一层往下搜索,至于求最短路径,也就是,因为,他是按层数遍历,所以相同层数,路径相同,从前往后,一个一个遍历,最先到终点的,一定是最短路径,但是,最短路径的大小是唯一的,最短路径的点数并不唯一,由这个图看,6和7,路径大小相同,但是首先输出的是6,所以,如果求最短路径时,到6,就已经停止,所以最短路径大小唯一,而点数,不唯一。
下面是代码简要:

#include "StdAfx.h"
#include<stdio.h>
#include<queue>
using namespace std;
const int maxn=100;
struct node{
	int x,y;
	int step;
}S,T,Node;//S为入口,T为出口,Node为中间节点;
int X[]={0,0,1,-1};
int Y[]={1,-1,0,0};//控制相邻位置
int map[maxn][maxn]={0};//迷宫信息
bool mark[maxn][maxn]={false};//标记位置是否走过;
bool judge(int x,int y)//判断该点是否有效
{
	if(x>=maxn||x<0||y>=maxn||y<0)//超过边界无效
		return false;
	if(map[x][y]==0||mark[x][y]==true)//使用过,或者,不存在,无效;
		return false;
	return true;
}
int BFS()
{
	queue<node> q;//定义队列,也可以用栈;
	q.push(S);//将起点S入队
	while(!q.empty())
	{
		node top=q.front();//取出队首;
		q.pop();//队首元素出队;
		if(top.x==T.x&&top.y==T.y)//直接返回最少步数;
		{
			return top.step;
		}
		for(int i=0;i<4;i++)//循环4次,得到4个相邻位置;
		{
			int newX=top.x+X[i];
			int newY=top.y+Y[i];
			if(judge(newX,newY))//判断新点是否为有效位置;
			{
				Node.x=newX;
				Node.y=newY;
				Node.step=top.step+1;//步数加1,也就是层数加1;
				q.push(Node);//新点入队
				mark[newX][newY]=true;//标记已走过;
			}
		}
	}
	return -1;//没有出口,返回-1
}
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);//边界
	for(int i=0;i<n;i++)
	{
		getchar();//吃掉回车,也就是换行符;
		for(int j=0;j<m;j++)
		{
			map[i][j]=1;
		}
		map[i][m+1]=0;
	}
	scanf("%d%d%d%d",&S.x,&S.y,&T.x,&T.y);//起点坐标,终点坐标
	S.step=0;//初始化起点层数为0,即S到S的最少步数为0;
	printf("%d\n,BFS()");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值