====BFS====

BFS(广度优先搜索)//   直接给你甩一个bfs的概念,初学者你看的懂吗?我是不懂
bfs也是一个对连通图进行遍历的算法。它的思想是从一个被选定的点出发;然后从这个点的所有方向每次只走一步的走到底(即其中一个方向走完一步之后换下一个方向继续走);如果得不到目的解,那就返回事先定好的值,如果找到直接返回目的解。
与dfs不同的是,bfs不是运用的递归,而是运用队列和函数内循环构造的。

 

那么接下来说明BFS的实现

int visit[N][N]//用来记录走过的位置
int dir[4][2]={0,-1,0,1,-1,0,1,0};
struct node
{
	int x,y,bits;//一般是点,还有步数,也可以存其他的
};
queue<node>v;
void bfs1(node p)
{
	node t,tt;
	v.push(p);
	while(!v.empty())
	{
		t=v.front();//取出最前面的
		v.pop();//删除
		if(找到符合条件的)//这边的条件例如迷宫寻址中满足终点的条件
		{
			做记录;//这边的记录例如迷宫寻址中步数最后的赋值,能够到达终点那么就把距离赋值为t.bits
			while(!v.empty()) v.pop();//如果后面还需要用,随手清空队列
			return;
		}
		visit[t.x][t.y]=1;//走过的进行标记,以免重复,这步别忘了
		rep(i,0,4)//做多次查找//就是for(int i = 0;i<4;i++)==rep(i.0.4)
		{
			tt=t;
			tt.x+=dir[i][0];tt.y+=dir[i][1];//这里的例子是向上下左右查找的
			if(如果这个位置符合条件)//这边是为了判断当前位置是否能够到达,如果能够到达就步数加一,并推进队列中,
你可能会以为步数会不会加四次,答案是不会,
因为每一次循环的tt都是一个新的点(因为一进循环就会给赋值为t,然后上下左右这样,这个赋值是不会影响上一个压入的tt的值的),
所以如果都符合条件的话压入都是不同的点,因此步数加一也就是前面获得的队首元素的距离加一,比如t离起点的距离是5,
那么如果上下左右都符合条件,那么t上下左右的距离就是t.bits++;
			{
				tt.bits++;//步数加一
				v.push(tt); //把它推入队列,在后面的时候就可以用了
			}
		}
	}
}

对于看完有些疑虑的人的建议:

我一开始学bfs的时候会在意,为什么一次压入了四个点,但是每次只从队首出来一个,又加了四个呢这不是遍历不完了吗,这是我一开始没搞懂的,事实上这个是FIFO,也就是队列,先进先出,后进后出,也就是就算你在一直把点压入队列中,我每次也是从队首出元素判断,而不是队尾比如:

有结点1.2.3.4.5.6.7.8.9,结点1下面有结点2,3,4,结点2下面有结点5,6,结点3下面有结点7,8,结点4下面有结点9,那么第一次遍历结点1,把结点1压入队列,然后弹出队首结点1,遍历它下的所有结点2,3,4,把2,3,4压入队列,第二次遍历,我再将队首结点2弹出,遍历5,6,把5,6压入队列,此时队列是3,4,5,6,假设终点是结点8,那么第三次就会遍历结点3,再把7,8压入队列,再遍历4,再压入9,此时队列中是5,6,7,8,9,然后再遍历5,5下面没有结点,遍历6,依次到7都没用结点而且都不符合终点要求,直到遍历到8,8是终点,因此我们到达了终点直接返回;

下面这张图可能会更加直观,广度搜索就像一层一层往下遍历,牺牲了空间换取时间,与DFS深度搜索相反

 

 

当遇到一些层次较深的树图时,dfs一读到底的风格就不太适合一些限制时间的题,因为针对这些内存巨大的,使用dfs就会比较耗时,比方说一个数有1000个树枝,每个树枝有100个子叶,第1000的第一颗叶子就是正解,但是在遍历的时候却选择从第一个树枝开始遍历且一读到底,遍历到正解得时候已经做了999*100次遍历了,这时只要把dfs换成bfs,就会节约许多时间,只需要1000次的遍历就可以找到答案,所以由上可得,在一些大的内存或者层次比较的大树,应选择使用bfs来解决;反之,则使用dfs。


还有一些根据题意就可以看出来是选择dfs还是bfs;比如题中需要的目的解是需要判断从最初的状态能否得到,这个时候就应该选择dfs了。像一些需要一步一步的完成就要选择bfs。

总的来说,dfs和bfs大都运用在图的处理上:如迷宫,八皇后,n皇后,油田,连通块,数独等,在这些类型的题上几乎全需要dfs或bfs来解,或者说有些难度更大的需要bfs+dfs或bfs+bfs才能完成。

接下来是我算法与数据结构课的一题例题,方便理解BFS:

http://t.csdn.cn/hbtaO

REFERENCE//这边还有一篇其他博主的文章方便理解
https://blog.csdn.net/weixin_43876357/article/details/112552683

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值