迷宫问题——(java)(bfs)

2.走迷宫 - 蓝桥云课

bfs :我的理解就是按层数便利,便利完一层再遍历下一层

bfs:一般用来求解权相等的最短路径和最小操作数的问题

一般使用队列来实现

1.初始化队列 先将起始节点放入队列中

2.从队列中取出一个没有访问过的节点,将该节点的访问状态设置为已经访问,将这个节点的所有的邻居节点加入队列

3.确保每个节点都制备访问过一次,避免死循环

4.重复以上步骤,直到队列为空

假设所有 的边权都是1 (边权可以理解为相连 的两个点的距离 ,也就是一条边的长度)

1.首先先将1添加到队列中

然后访问1 的相邻节点

他们没有被 访问过,添加到队列中

1 现在已经被访问过了,就要把他移出队列

注意:队列中只存放没有访问过的元素

Queue [] 表示队列

dis表示起点到队中某一个元素的最短距离

1到1 本身的最短距离肯定是0 呀
1->2,3,4 的距离都是1

访问过的节点标成橙色

第一层便利完成了

然后开始便利第二层

注意:添加到队列中不代表这元素已经被访问过了

只有这个元素的相邻节点都添加到队列中了,才算这个元素被访问过了

我们每次只添加队头的相邻元素,然后添加完队头的相邻元素(注意:只添加没有访问过的元素,1虽然也是相邻元素,但是1已经被访问过了,所以添加1到队列),队头就算已经访问过了
现在队头是2 2 的相邻元素有1 , 5  ,6 ,但是1已经被访问过了,所以把5和6两个没有访问过的元素添加到队尾,

距离数组dis 就是在2到1 的距离的基础上再加上5 到2 的距离和6 到2 的距离

此时2也已经被访问过了,取出队头元素2 

现在队头元素是3,3 的相邻节点只有1 ,并且1 已经被访问过了,所以3没有可以添加的相邻节点,

现在3也访问过了,取出队头元素3

此时队头元素是4 ,同理将4 的没有被访问过的相邻节点添加到队列中

然后计算每一个添加的元素到起点的距离

该处理第三层元素了,5在队头,5没有未被访问过的节点,所以也不用添加,然后5也被访问过了,6同理

789也同理

队列为空结束访问,因为没有可以访问的节点了,就该结束了

总结:先将第一个元素放到队列中,然后进入循环,直到队列为空,结束循环

每次将队首的元素的取出,然后添加和队首元素相邻并且没有被访问过的元素到队尾,然后更新队列中的每一个元素到起点的最短距离

队首的元素不断变化,队尾的元素不断添加,最后直到每一个节点都被访问过,那么此队列中就无法添加元素了,队列中的元素就会不断的减少直到变成空队列。

迷宫问题的思路大概就是

回想一下我们刚才的思路

起点,终点

只要终点被访问过了是不是就是可以到达终点,

我们用两个数组来分别记录每个节点是否被访问过,以及每个节点到起点的最短路径

//        定义一个boolean数组来表示节点的访问状态boolean[][] v = new boolean[n+10][m+10];
//        定义一个二维的距离数组b来表示从起点到任意一个1个节点最短路径int[][] d = new int[n+10][m+10];

一开始把所有节点到起点的都设置为不可达,也就是到起点的距离是无穷,直接设置成1e9 (1* 10 的9 次方)

//初始化所有最短路径为不可达状态 +无穷大的形式for (int i = 1; i <=n ; i++) {Arrays.fill(d[i], (int) 1e9);}

然后再用一个队列来进行循环

然后用Queue(队列来存储)因为是二维的我们可以用Queue<Int[]>

//        队列用q表示
// 每个节点有两个坐标,队列中的节点开一个int数组类型
//        队列可以用LinkedList来表示Queue<int[]> q = new LinkedList<>();

队列一般使用LinkedeList(处理首尾节点的时间复杂度都是O(1))

先把起点坐标x1y1 添加到队列中

//        先将起点放入队列中q.add(new int []{x1,y1});

然后更新最短路径数组 中起点的值

//        从起点到起点的距离是0d[x1][y1] = 0;

然后每一个位置是不是都可以上下左右移动

下面这个顺序是下上右左 

//表示上下左右四个操作int dx[]  = {0,0,1,-1};int dy[]  = {1,-1,0,0};

然后当队列非空的时候就进行循环判断

//       当队列非空的时候while (!q.isEmpty()){

先取出队首元素分别获取横纵坐标

//        拿出队头元素int []o = q.poll();
//            当前节点的x和yint x = o[0],y =o[1];

判断队首元素是否被访问过,如果被访问过,就判断队首元素的下一个元素

//            如果当前节点是已经访问状态,跳过这个节点访问下一个节点if(v[x][y]){continue;}

如果没有被访问过的话,就把他标记成访问过

//            否则标记成已经访问的状态v[x][y] = true;

记录这个队首元素的上下左右中的一种情况的相邻节点的坐标

  int nx = dx[i] + x;int ny =dy[i] + y;

判断坐标是否都满足这三个条件

有没有被访问过

 v[nx][ny]

是不是路障

g[nx][ny]==0

有没有超出边界(起点按照1,1 终点按照n,m )

nx>n || nx <1 || ny >m || ny < 1

可达,也就是不满足以上条件

相邻节点的距离都是在队首元素到起点的最短距离的基础上加1 ,(某个点到旁边的点的距离)

在把这些节点添加到队列的末尾

else {d[nx][ny]= d[x][y] + 1;
//                    在队列中添加新的相邻节点q.add(new int[]{nx,ny});}

 下面是循环判断的代码


//       当队列非空的时候while (!q.isEmpty()){
//        拿出队头元素int []o = q.poll();
//            当前节点的x和yint x = o[0],y =o[1];
//            如果当前节点是已经访问状态,跳过这个节点访问下一个节点if(v[x][y]){continue;}
//            否则标记成已经访问的状态v[x][y] = true;for (int i = 0; i <4 ; i++) {
//                表示相对于队首节点的坐标int nx = dx[i] + x;int ny =dy[i] + y;
//            超出了我们的边界
//            或者当前节点已经杯访问过了
//            或者当前节点是障碍物
//            不合法的if(nx>n || nx <1 || ny >m || ny < 1 || v[nx][ny] || g[nx][ny]==0){continue;}else {d[nx][ny]= d[x][y] + 1;
//                    在队列中添加新的相邻节点q.add(new int[]{nx,ny});}}}

最后循环结束判断终点x2,y2 是否被访问过,如果被访问过,就代表终点可达,就输出终点到起点的最短距离

如果没有被访问过就输出-1

     //            判断重点是否可达if(!v[x2][y2]){System.out.println(-1);}else {System.out.println(d[x2][y2]);}

最后下面是完整的代码,

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;/*** @author zb* date2025/3/25 18:22*/
public class Main{public static void main(String[] args) {Scanner in = new Scanner(System.in);
//        迷宫的大小int n = in.nextInt(),m =in.nextInt();int g[][]  = new int[n+10][m+10];
//        表示是否为障碍物for (int i = 1; i <=n ; i++) {for (int j = 1; j <=m ; j++) {g[i][j] = in.nextInt();}}
//        入口和出口int x1 = in.nextInt(),y1 = in.nextInt();int x2 =in.nextInt(), y2 =in.nextInt();
//        定义一个boolean数组来表示节点的访问状态boolean[][] v = new boolean[n+10][m+10];
//        定义一个二维的距离数组b来表示从起点到任意一个1个节点最短路径int[][] d = new int[n+10][m+10];
//初始化所有最短路径为不可达状态 +无穷大的形式for (int i = 1; i <=n ; i++) {Arrays.fill(d[i], (int) 1e9);}
//        从起点到起点的距离是0d[x1][y1] = 0;
//        队列用q表示
// 每个节点有两个坐标,队列中的节点开一个int数组类型
//        队列可以用LinkedList来表示Queue<int[]> q = new LinkedList<>();
//        先将起点放入队列中q.add(new int []{x1,y1});
//表示上下左右四个操作int dx[]  = {0,0,1,-1};int dy[]  = {1,-1,0,0};//       当队列非空的时候while (!q.isEmpty()){
//        拿出队头元素int []o = q.poll();
//            当前节点的x和yint x = o[0],y =o[1];
//            如果当前节点是已经访问状态,跳过这个节点访问下一个节点if(v[x][y]){continue;}
//            否则标记成已经访问的状态v[x][y] = true;for (int i = 0; i <4 ; i++) {
//                表示相对于队首节点的坐标int nx = dx[i] + x;int ny =dy[i] + y;
//            超出了我们的边界
//            或者当前节点已经杯访问过了
//            或者当前节点是障碍物
//            不合法的if(nx>n || nx <1 || ny >m || ny < 1 || v[nx][ny] || g[nx][ny]==0){continue;}else {d[nx][ny]= d[x][y] + 1;
//                    在队列中添加新的相邻节点q.add(new int[]{nx,ny});}}}//            判断重点是否可达if(!v[x2][y2]){System.out.println(-1);}else {System.out.println(d[x2][y2]);}in.close();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/39911.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Axure大屏可视化模板:赋能多领域,开启数据展示新篇章

在当今这个数据爆炸的时代&#xff0c;数据已经成为各行各业的核心资产。然而&#xff0c;如何高效、直观地展示数据&#xff0c;并将其转化为有价值的决策依据&#xff0c;成为了许多企业和组织面临的共同挑战。Axure大屏可视化模板&#xff0c;作为一款强大的数据展示工具&am…

Linux--进程控制

ok&#xff0c;我们今天学习Linux中的进程控制&#xff08;进程创建、终止、等待、替换&#xff09; 进程创建 fork函数 在linux中fork函数是⾮常重要的函数&#xff0c;它从已存在进程中创建⼀个新进程。新进程为子进程&#xff0c;⽽原进程为父进程。 #include <unist…

【开源宝藏】用 JavaScript 手写一个丝滑的打字机动画效果

你当前项目实现了一个非常丝滑的 打字机文字效果动画&#xff0c;使用的是自定义的 typical.js 脚本。下面我将给出一份逐步拆解的中文教程&#xff0c;帮你或其他初学者快速上手并自定义这个打字效果。 ✨ 最终效果 打开页面后&#xff0c;中央会逐字显示&#xff1a; Hello…

UE4学习笔记 FPS游戏制作17 让机器人持枪 销毁机器人时也销毁机器人的枪 让机器人射击

添加武器插槽 打开机器人的Idle动画&#xff0c;方便查看武器位置 在动画面板里打开骨骼树&#xff0c;找到右手的武器节点&#xff0c;右键添加一个插槽&#xff0c;重命名为RightWeapon&#xff0c;右键插槽&#xff0c;添加一个预览资产&#xff0c;选择Rifle&#xff0c;根…

气象可视化卫星云图的方式:方法与架构详解

气象卫星云图是气象预报和气候研究的重要数据来源。通过可视化技术,我们可以将卫星云图数据转化为直观的图像或动画,帮助用户更好地理解气象变化。本文将详细介绍卫星云图可视化的方法、架构和代码实现。 一、卫星云图可视化方法 1. 数据获取与预处理 卫星云图数据通常来源…

26考研——树与二叉树_树、森林(5)

408答疑 文章目录 二、树、森林树的基本概念树的定义和特性树的定义树的特性 基本术语树的基本术语和概念祖先、子孙、双亲、孩子、兄弟和堂兄弟结点的层次、度、深度和高度树的度和高度分支结点和叶结点有序树和无序树路径和路径长度 森林的基本术语和概念森林的定义森林与树的…

为何服务器监听异常?

报错&#xff1a; 执行./RCF后出现监听异常--在切换网络后&#xff0c;由于前面没有退出./RCF执行状态&#xff1b;重新连接后&#xff0c;会出现服务器监听异常 原因如下&#xff1a; 由于刚开始登录内网&#xff0c;切换之后再重新登录内网&#xff0c;并且切换网络的过程中…

ROS2 架构梳理汇总整理

文章目录 前言正文机器人平台整体架构&#xff08;ROS2&#xff09;图一、个人理解整体架构 ROS2架构图一、个人理解ROS2整体架构图二、开发者整理ROS2整体架构图三、Intel整理ROS2整体架构图四、DDS具体架构说明 ROS2 Control架构图一、官方整整理ROS2 Control整体架构 总结 前…

定长内存池原理及实现

目录 一、池化技术 二、内存池 三、内存池主要解决的问题 四、定长内存池的实现 1.定长内存池的原理 2.框架 3.Delete实现 4.New实现 5.性能测试 五、源码 FixedMemoryPool.h test.cc 一、池化技术 所谓“池化技术”&#xff0c;就是程序先向系统申请过量的资源&…

广告推荐算法 - 学习笔记

文章目录 1、前言2、学习笔记2.1、什么是计算广告系统&#xff1f; 1、前言 本篇博客&#xff0c;是我用来记录学习广告推荐算法的一些笔记和总结。 参考内容&#xff1a; 1、王喆&#xff1a;"深度"学习计算广告 2、deepseek 2、学习笔记 2.1、什么是计算广告系统…

卷积神经网络的原理、实现及变体

卷积神经网络convolutional neural network&#xff0c;CNN 是为处理图像数据而生的网络&#xff0c;主要由卷积层&#xff08;填充和步幅&#xff09;、池化层&#xff08;汇聚层&#xff09;、全连接层组成。 卷积 虽然卷积层得名于卷积&#xff08;convolution&#xff09…

Excel第41套全国人口普查

2. 导入网页中的表格&#xff1a;数据-现有链接-考生文件夹&#xff1a;网页-找到表格-点击→变为√-导入删除外部链接关系&#xff1a;数据-点击链接-选中连接-删除-确定&#xff08;套用表格格式-也会是删除外部链接&#xff09;数值缩小10000倍&#xff08;除以10000即可&am…

深度学习篇---回归分类任务的损失函数

文章目录 前言一、分类任务常用损失函数1. 交叉熵损失&#xff08;Cross-Entropy Loss&#xff09;数学形式使用场景特点训练状态分析损失下降损失震荡训练损失低但是验证损失高 2. Hinge Loss&#xff08;合页损失&#xff09;数学形式适用场景特点训练状态分析损失趋近于0损失…

OpenCV三维解算常用方法C++

如果标定过程是通过OpenCV张正友标定法实现的&#xff0c;得到的内参外参保存在.txt文件中是这样的形式&#xff1a; ① 内参intrinsics.txt&#xff1a; ② 外参extrinsics.txt&#xff1a; 那么可以通过如下方法读取.txt文件获取左右相机内外参&#xff0c;主要包括三维解算…

光电效应及普朗克常数的测定数据处理 Python实现

内容仅供参考&#xff0c;如有错误&#xff0c;欢迎指正&#xff0c;如有疑问&#xff0c;欢迎交流。 因为我不会Excel所以只能用Python来处理 祝大家早日摆脱物理实验的苦海 用到的一些方法 PCHIP &#xff08;分段三次埃尔米特插值多项式&#xff09; 因为实验时记录的数…

【日常笔记 1】 有关异常学习笔记

今天笔记内容详见 ----- C11_5 异常部分 笔记较乱 , 笔者只是为了记录重要知识点 , 想重点了解相关知识点的可关注笔者正文栏目 ~ 笔者代码仓 : C11_5 代码 异常部分学习笔记 异常基本关键字信息   throw    ----    抛出异常   try - catch ----    捕获异常 , 必须…

Linux UDP网络编程套接字sockets

目录 一、预备知识 1、IP地址 2、端口号 3、Socket网络通信 4、认识TCP/UDP协议 &#xff08;1&#xff09;TCP协议 &#xff08;2&#xff09;UDP协议 &#xff08;3&#xff09;网络字节序 二、socket网络套接字 1、概念 2、Socket 的地址结构和一系列转换函数 &a…

VUE3项目VITE打包优化

VUE3项目VITE打包优化 代码加密依赖配置效果对比图 自动导入依赖配置 代码压缩依赖配置效果对比图 图片压缩依赖配置效果对比图 字体压缩总结与实践运用效果 代码加密 依赖 npm install -D vite-plugin-bundle-obfuscator配置 import vitePluginBundleObfuscator from "…

NO.57十六届蓝桥杯备战|基础算法-高精度|加减乘除|模拟竖式计算(C++)

当数据的值特别⼤&#xff0c;各种类型都存不下的时候&#xff0c;此时就要⽤⾼精度算法来计算加减乘除&#xff1a; 先⽤字符串读⼊这个数&#xff0c;然后⽤数组逆序存储该数的每⼀位&#xff1b;利⽤数组&#xff0c;模拟加减乘除运算的过程。 ⾼精度算法本质上还是模拟算法…

最新DeepSeek-V3-0324:AI模型性能提升与新特性解析

文章目录 性能提升概览新特性解析1. 推理任务表现提高2. 前端开发能力增强3. 中文写作与搜索能力优化4. 模型开源 总结与展望 随着人工智能技术的快速发展&#xff0c;模型的迭代更新成为推动技术进步的重要力量。最近&#xff0c;DeepSeek团队发布了其V3模型的最新小版本更新—…