javaScript——BFS结合队列求迷宫最短路径

这里推荐先去看下B站这个老师讲的BFS迷宫问题,只用看前五分钟就能懂用BFS+队列实现的原理。[POJ] 3984 迷宫问题 BFS_哔哩哔哩_bilibili

问题描述:由m*n的矩阵构成了一个迷宫, 矩阵中为1的元素表示障碍物,不能走,为0表示可以走。同时,可以你可以竖着或横着走都行,也就是四个方向都可以。问:从起点到终点的最短路径是多少,并输出最短路径上的路径信息。

 思路:采用广度优先搜索的方式,尝试让某个点朝四个方向各走一步,如果都能走通,将这些路径和步长入队。每次都对队列的元素尝试往前走一步,最早找到终点的路径就是要求的最短路径。我们定义的方向是下、上、右、左。假设由两个点分别向下、向右走一步都到了终点,并且两者的step相等,那么,先遍历的也就是向下的这个路径作为目标输出。即使路径长度都一样,只要一个即可。

 

 广度遍历不需要回溯:开始时用队列存储第一个为遍历的节点。从第一个点开始,将它shift出去,然后尝试向四周走一步,如果走的通,将那个节点和路径信息入队,依次遍历所有方向。

下次遍历时,队列里是步长为1的准备往下一步的节点了。跟之前一样,挨个shift出去,然后你就尝试四周走吧。。。直到已遍历到end节点结束。

大白话思想:从根节点出发,每次只走一步(四个方向都考虑一下),或者阻塞了走不了;走不了也shift出去了,下次不带他继续走了。每次都带着可以走的节点继续往前走。最先走到终点的节点就是循环结束。如果找不到,返回-1。

function shortestPath(maze, start, end) {const rows = maze.length;const cols = maze[0].length;//定义方向const directions = [[0, 1], //向下走一步,[0, -1], //向上走一步[1, 0], //向右走一步[-1, 0], //向左走一步];const visited = Array.from(Array(rows), () => Array(cols).fill(false));const queue = [[start, 0, []]];while (queue.length > 0) {const [[X, Y], steps, path] = queue.shift();if (X === end[0] && Y === end[1]) {return [steps, path.concat([[X, Y]])];}for (let dir of directions) {const [dx, dy] = dir;const newX = X + dx;const newY = Y + dy;if (newX >= 0 &&newX < rows &&newY >= 0 &&newY < cols &&maze[newX][newY] == 0 &&!visited[newX][newY]) {visited[newX][newY] = true;queue.push([[newX, newY], steps + 1, path.concat([[X, Y]])]);}}}return [-1, []];
}
// 示例迷宫
const maze = [[0, 1, 0, 0, 0],[0, 0, 0, 1, 0],[1, 1, 0, 1, 0],[1, 1, 0, 0, 0],[0, 0, 0, 0, 0],
];const start = [0, 0]; // 起点坐标
const end = [4, 4]; // 终点坐标const [steps, path] = shortestPath(maze, start, end); // 调用函数计算最短路径
if (steps !== -1) {console.log(`最短步数为:${steps}`); // 输出最短步数console.log("最短路径为:" + "[" + path.join("]->[") + "]"); // 输出最短路径
} else {console.log("未找到路径"); // 输出未找到路径的提示
}

 这里用二维数组存储节点已访问的状态。能不能走由四个条件判断:

newX和newY下标必须合理;maze对应位置不能有障碍,当前节点未访问

queue存储的是未遍历四个方向的当前节点。数组中每项存储的是当前遍历的节点座标,走到该节点的步长,节点携带的路径数组。

熟悉js的结构赋值,减少新增变量

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

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

相关文章

如何在职场中提升自己的竞争力

随着社会的发展&#xff0c;职场竞争日益激烈。如何在职场中提升自己的竞争力&#xff0c;成为许多职场人士关注的焦点。本文将从以下几个方面为大家提供一些建议。 一、不断学习&#xff0c;提升专业技能 在职场中&#xff0c;专业技能是衡量一个人竞争力的重要标准。要想在职…

软考高级:项目管理-软件质量控制和质量保证概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

让数据在两个buckets之间传输 - Google Storage Transfer Service

在业务场景中&#xff0c; 有时我们不想直接暴露数据存储空间给上游系统&#xff0c; 而需要设置1个landing Path 让上游系统发送数据 如图&#xff1a; 我们只需grant landing bucket 的权限给上游系统&#xff0c; 而上游系统是访问不了storage bucket的保证了数据隔离 但是…

这个小技巧真不错!

大家好&#xff0c;我是前端队长。前端程序员&#xff0c;2023年开始玩副业。玩过AI绘画&#xff0c;公众号爆文项目&#xff0c;累计变现五位数。 今天看到萌萌在陪伴群分享了我公众号次图封面显示不全的问题。 这里我分享设计师萌萌的方法&#xff0c;很简单&#xff0c;但是…

想要在浏览器中访问pdf内容,服务器器该如何配置

1、需要先放置PDF文件&#xff1a; 将你的PDF文件放置在服务器的某个目录下&#xff0c;例如/var/www/html/pdfs/。确保服务器有权限读取这个目录中的文件。 2、配置Nginx&#xff1a; 在Nginx的配置文件中为PDF文件添加一个location块。 server { listen 80; server_name…

为什么HubSpot可以干翻营销和销售副总裁?

本文纯属虚构&#xff0c;作为销售的人&#xff0c;看完惊出一身大汗绝对属于正常。建议您先准备一个大毛巾&#xff0c;等下看完肯定会出汗的。还有&#xff0c;别忘记睡前给自己倒满一杯红酒&#x1f377;&#xff0c;今晚会失眠的呢。 1. 为什么是Hubspot&#xff1f; 2. H…

make | ubuntu源码编译指定版本make

下载源码包&#xff1a;Index of /gnu/make # 解压 tar -zxvf cmake-xxx.tar.gzcd cmake-xxx# 编译配置 ./configure ./build.sh# 先用apt安装一个make apt update apt install make# 然后使用系统的make来编译指定版本的make make install# 这时已经生成了可执行程序make # 然…

C# SetWindowPos函数

在C#中&#xff0c;SetWindowPos函数用于设置窗口的位置和大小。 原型&#xff1a; [DllImport("user32.dll", SetLastError true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int …

金融知识分享系列之:KD指标

金融知识分享系列之&#xff1a;KD指标 一、KD指标二、KD指标计算三、KD指标原理四、KD指标应用 一、KD指标 KD信号提供入场的工具 名称&#xff1a;随机震荡指标参数&#xff1a;&#xff08;9,3,3&#xff09;组成&#xff1a;K线&#xff0c;D线&#xff0c;20轴&#xff0…

【Linux】传输层协议:TCP/UDP

目录 netstat pidof UDP协议 TCP协议 TCP协议段格式 TCP协议的相关机制 确认应答&#xff08;ACK&#xff09;机制 超时重传机制 连接管理机制 服务端状态转换 客户端状态转化 流量控制 流量控制常见问题&#xff1a; 滑动窗口 拥塞控制 延迟应答 面向字节流…

流畅的 Python 第二版(GPT 重译)(九)

第四部分&#xff1a;控制流 第十七章&#xff1a;迭代器、生成器和经典协程 当我在我的程序中看到模式时&#xff0c;我认为这是一个麻烦的迹象。程序的形状应该只反映它需要解决的问题。代码中的任何其他规律性对我来说都是一个迹象&#xff0c;至少对我来说&#xff0c;这表…

(day 14)JavaScript学习笔记(对象2)

概述 这是我的学习笔记&#xff0c;记录了JavaScript的学习过程。在写博客的时候我会尽量详尽的记录每个知识点。如果你完全没接触过JavaScript&#xff0c;那么这一系列的学习笔记可能会对你有所帮助。 今天继续学习对象&#xff0c;主要是this、getters和setters、原型&#…

vulhub中DNS域传送漏洞复现

DNS协议支持使用axfr类型的记录进行区域传送&#xff0c;用来解决主从同步的问题。如果管理员在配置DNS服务器的时候没有限制允许获取记录的来源&#xff0c;将会导致DNS域传送漏洞。 环境搭建 Vulhub使用Bind9来搭建dns服务器&#xff0c;但不代表只有Bind9支持AXFR记录。运行…

Power BI学习(数据可视化)

另一个也可以的工具是&#xff1a;Tableau 还有一个是&#xff1a;神策&#xff0c;主要是用于互联网的app的数据埋点 数据分析的过程&#xff1a; 数据源--数据清洗&#xff08;power query&#xff09;-构建指标 新建度量值&#xff08;power pivot&#xff09;-可视化&…

构建一个前端智能停车可视化系统

引言 随着城市化进程的加速&#xff0c;停车难问题日益突出。智能停车可视化系统通过实时展示停车场的车位信息&#xff0c;帮助用户快速找到空闲车位&#xff0c;提高停车效率。 目录 引言 一、系统设计 二、代码实现 1. 环境准备 2. 安装依赖 3. 创建停车场组件 4. 集…

能源新动力:移动电站行业洞察报告

在全球能源结构转型和灾害应急需求不断上升的背景下&#xff0c;移动电站作为一种新型的电力供应解决方案&#xff0c;正逐渐成为保障临时供电、支持灾难恢复、以及促进能源普及的关键技术。本报告旨在全面分析移动电站行业的发展现状、技术趋势、市场潜力及面临的挑战&#xf…

python与excel第三节

批量重命名多个工作簿的名称 import os file_path D:\\TEST\\python与excelfile_list os.listdir(file_path)# 给出工作簿名中包含的需要替换的旧关键字和新关键字old_book_name 订单new_book_name 产品print(修改前名称&#xff1a;,file_list)for i in file_list: #…

React—— props校验(非typescript校验类型)

非typescript环境下&#xff0c;当我们在封装组件的时候&#xff0c;接受props时传入的内容&#xff0c;需要做类型检测&#xff0c;那我们可以用props校验进行类型的检查。 props校验允许在创建组件的时候&#xff0c;就约定props的格式、类型等 实现步骤&#xff1a; 导入 …

FDU 2018 | 2. 集合交并

文章目录 1. 题目描述2. 我的尝试1. C容器2. 排序二路归并 1. 题目描述 AcWing 3688 集合交并 输入两个集合&#xff0c;分别求其交集和并集中元素的个数&#xff0c;每个集合中可能存在相同的元素&#xff0c;而最终的交集和并集中应该不存在。 输入格式 第一行输入两个整数 n…

MAC IntelliJ IDEA搭建Doris Fe

目录 版本信息 安装环境依赖 拉取源码 下载 Doris 编译依赖 修改系统最大文件句柄数 编译 Doris 配置 Debug 环境 生成 FE 代码 FE模块代码导入 配置 Debug FE 启动 FE 报错问题 版本信息 本次安装的doris版本信息为doris-2.1.0-rc11 IntelliJ IDEA 配置jdk17、m…