当前位置: 首页 > news >正文

bfs求解迷宫问题

题目链接:

2.走迷宫 - 蓝桥云课https://www.lanqiao.cn/problems/1216/learning/?problem_list_id=30&page=1

题目描述:

        给定一个 N×M的网格迷宫 G。G 的每个格子要么是道路,要么是障碍物(道路用 1 表示,障碍物用 0 表示)。已知迷宫的入口位置为 (x1,y1),出口位置为 (x2,y2)。问从入口走到出口,最少要走多少个格子。

输入描述:

       输入第 1 行包含两个正整数 N,M,分别表示迷宫的大小。接下来输入一个 N×M 的矩阵。若 Gi,j=1表示其为道路,否则表示其为障碍物。最后一行输入四个整数 x1,y1,x2,y2,表示入口的位置和出口的位置。1≤N,M≤10^2,0≤Gi,j≤1,1≤x1,x2≤N,1≤y1,y2≤M。

输出描述:

        输出仅一行,包含一个整数表示答案。若无法从入口到出口,则输出 −1。

输入:

5 5 
1 0 1 1 0
1 1 0 1 1 
0 1 0 1 1
1 1 1 1 1
1 0 0 0 1
1 1 5 5 

输出: 

8

解题思路:

        bfs:先设置两个二维数组map和mark,分别表示该点能不能通过和是否已经被访问,并将mark使用memeset函数初始化为-1。将入口加入到队列中,并使用dx和dy依次访问每个队头原酸的周围4个点,如果未被访问并且可以被访问则将其加入到队列中,并将该元素的距离设置为起上一个元素的距离+1,当访问完周围四个点之后,将该元素退出队列,依次类推就可以将所有元素按照顺序依次被访问,并得到所有元素的据入口的距离。

代码:

#include <iostream>
#include<cstring>
#include<queue>
#define MAX 101
using namespace std;

int map[MAX][MAX];    //用于记录坐标是否课通过
int mark[MAX][MAX];    //用于记录坐标是否被访问过
typedef pair<int, int> PII;     //定义坐标数据变量
queue <PII>q;     //队列
int dx[] = { -1,0,1,0 };   //x方向上的变量
int dy[] = { 0,-1,0,1 };   //y方向上的变量

//广度优先遍历算法
int bfs(int N, int M, int x1, int y1, int x2, int y2) 
{
	memset(mark, -1, sizeof(mark));    //对数组进行初始化
	mark[x1 - 1][y1 - 1] = 0;    //访问入口
	q.push({ x1 - 1, y1 - 1 });    //将入口放入队列中
	while (!q.empty())   //访问所有的可访问点
	{
		PII top = q.front();
		for (int i = 0;i < 4;i++)
		{
			//遍历队列第一个节点的上下左右四个节点
			int nex = top.first + dx[i];
			int ney = top.second + dy[i];
			if ((nex >= 0 && nex < N) && (ney >= 0 && ney < M) && (map[nex][ney] == 1) && (mark[nex][ney] == -1)) 
			{
				mark[nex][ney] = mark[top.first][top.second] + 1;    //距离起点的长度+1
				q.push({ nex,ney });     //将新节点加入队列中
			}
		}
		q.pop();    //将队列第一个节点读取完毕后删除
		//cout << "aaa" << endl;
	}

	//查看mark值
	//for (int i = 0;i < N;i++)
	//{
	//	for (int j = 0;j < M;j++)
	//	{
	//		cout<<mark[i][j]<<" ";
	//	}
	//	cout << endl;
	//}
	return mark[x2 - 1][y2 - 1];    //返回终点的标记值
}

int main()
{
	// 请在此输入您的代码
	//输入
	int N, M;
	cin >> N >> M;
	for (int i = 0;i < N;i++)
	{
		for (int j = 0;j < M;j++)
		{
			cin >> map[i][j];
		}
	}
	int x1, y1, x2, y2;
	cin >> x1 >> y1 >> x2 >> y2;
	cout << bfs(N, M, x1, y1, x2, y2) << endl;;
	return 0;
}

 

参考思路:第十三章 DFS与BFS(保姆级教学!!超级详细的图示!!)_dfs bfs-CSDN博客  

相关文章:

  • 无人机投屏技术解码过程详解!
  • docker引擎常用目录文件详解
  • 【系统架构设计师】以数据为中心的体系结构风格
  • Better-SQLite3 参数绑定详解
  • 二叉树的遍历
  • 【人工智能】Open WebUI+ollama+deepSeek-r1 本地部署大模型与知识库
  • 【Git】基本指令
  • 【全球化2.0 | ZStack发布Zaku容器云海外版 加速亚太生态布局
  • python项目中连接数据库详细版
  • Ubuntu搭建最简单WEB服务器
  • centos8 虚拟机重启后无法识别网卡 ens33 问题原因总结
  • 算法训练(leetcode)二刷第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • 最短路问题
  • linux上配置免密登录
  • 【每日五题系列】前端面试高频题目
  • VSCode 配置优化指南:打造极致高效的前端开发环境
  • 如何高效使用 Mybatis-Plus 的批量操作
  • java中小型公司面试预习资料(一):基础篇
  • python文本处理pdfminer库安装与使用
  • ZYNQ-PL学习实践(五)IP核之FIFO
  • 专业建站推广服务/百度打开
  • 外贸网站平台推广/网站优化内容
  • 罗定市建设局网站/重庆seo关键词优化服务
  • 直播网站开发/推广公众号的9种方法
  • 长沙模板建站服务公司/seo关键词分类
  • wordpress侧栏/北京seo网络优化师