返回顶部

广度优先搜索-BFS及其例题

题目

一道BFS

要在一张地图上从起点走到终点,首选广度优先搜索BFS,BFS通过队列来实现,队列能够让搜索有序地往下进行,BFS是向四周搜索,以广泛为其主要特点,相较深度优先搜索DFS,DFS用栈实现(栈符合其递归的性质),打个比方,是从起点出发,一条路走到没法走再回来走另一条路,而BFS相当于每一条路都先走一步看看,想象一滴水在一个迷宫里通过四处扩散找到出口,这就是广度优先搜索。

概念讲完了,接下来看怎么实现

从起点出发,将起点加入队列,用一个 while 循环来在队列不为空的时候(一旦队列为空就说明所有路都走过了)进行向四处扩散的操作,将队列头的元素取出来,通过一个 for 循环分别加上四个方向的偏移量得到四个方向的坐标,判断这四个方向是否走过,是否有障碍物,如果又没有障碍物又没走过,就将这个方向上的这一格标记为走过,接着再判断该点是否为终点,是的话就将实现定义好的 bool 变量改为一,代表能走到,如果不是终点就接着把这个可行的格子入队,留着之后再判这个格子的四方向。在队头元素的四个方向都判断完毕后,就可以弹出队头元素了,以上就是 BFS 函数的部分。

接下来看代码

#include <bits/stdc++.h>
using namespace std;
int n,m;
bool vis[105][105];
char ma[105][105];
int f[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//偏移量
bool ok;//判断能不能走的bool
struct node{
	int x,y;
};//每个位置的坐标结构体,广搜中结构体很好用
void bfs(int x,int y){//BFS部分
	deque<node>q;//个人比效习惯用双端队列
	q.push_back({x,y});//加入起点
	vis[x][y]=1;//将起点标记为走过
	while(!q.empty()){//判断队列是否为空
		node now = q.front();//取队头元素
		for(int i = 0;i < 4;i++){//加上偏移量
			node next;//下一次要走的
			next.x = now.x+f[i][0];
			next.y = now.y+f[i][1];
			if(ma[next.x][next.y]!='#'&&vis[next.x][next.y]==0
				&&next.x<=n&&next.x>=1&&next.y<=m&&next.y>=1){//判断是否障碍物,是否走过,是否越界
				if(next.x==n&&next.y==m){//判断是否到终点
					ok=1;//能走
				}
				vis[next.x][next.y]=1;//标记为走过
				q.push_back(next);//入队
			}
		}
		q.pop_front();//将队头元素弹出
	}
}
int main(){//主函数
	cin >> n >> m;
	for(int i = 1;i <= n;i++){
		for(int j = 1;j <= m;j++){
			cin >> ma[i][j];//输入地图
		}
	}
	bfs(1,1);//广搜
	if(ok)cout << "Yes";
	else cout << "No";//判断是否能走到,广搜结束ok仍等于零就说明没找到
	return 0;//结束QWQ
}


如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
posted @   铭Mingci  阅读(51)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示