解密逃脱路径判断算法

news2024/11/17 17:26:53

介绍

在计算机科学领域,有许多有趣的算法问题需要解决。其中之一就是判断在给定条件下是否存在逃脱路径的问题。本篇博客将介绍如何使用广度优先搜索(BFS)算法来解决这个问题。

问题背景

假设有一个二维平面上的迷宫,某人被困在迷宫中,需要从起点逃离到终点。但是,迷宫中有一些障碍物,人物无法通过障碍物移动。现在的问题是,是否存在一条路径可以使人物从起点逃离到终点,而不经过障碍物。

 例题

在一个 106 x 106 的网格中,每个网格上方格的坐标为 (x, y) 。

现在从源方格 source = [sx, sy] 开始出发,意图赶往目标方格 target = [tx, ty] 。数组 blocked 是封锁的方格列表,其中每个 blocked[i] = [xi, yi] 表示坐标为 (xi, yi) 的方格是禁止通行的。

每次移动,都可以走到网格中在四个方向上相邻的方格,只要该方格  在给出的封锁列表 blocked 上。同时,不允许走出网格。

只有在可以通过一系列的移动从源方格 source 到达目标方格 target 时才返回 true。否则,返回 false

例题链接:. - 力扣(LeetCode)

解题思路:BFS + 给定障碍物所能围成的最大面积

从 source 跑一遍 BFS,然后从 target跑一遍 BFS,同时设定一个最大访问点数量 MAX,若从两者出发能够访问的点数量都能超过 MAX,说明两点均没有被围住,最终必然会联通。其中MAX为len(blocked)个方块所能围成的最大面积,其为n(n-1)/2其中n=len(bloked),即当其排成斜线与边界围成直角三角形时,如图

  1. 初始化条件:将起点和终点作为初始条件,并将起点加入队列中。
  2. BFS搜索
    • 不断从队列中取出当前位置,然后向四个方向扩展搜索。
    • 对于每一个邻居节点,检查是否越界、是否是障碍物或已经访问过的节点。
    • 如果符合条件,则将该节点加入队列并标记为已访问。
    • 继续下一轮搜索直到找到终点或者队列为空。
  3. 路径限制
    • 为了避免无限搜索,设置一个最大搜索次数 MAX,当已访问节点数超过 MAX 时,认为路径可能存在但无法判断。
  4. 返回结果:根据最终搜索结果,判断是否存在可行的逃脱路径

详细题解见文末链接

python代码实现

MAX = int(1e5) #blocked所能围成的最大面积为n(n-1)/2    (2n=len(blocked)),最大时小于1e5
BASE = int(131)
dircs = [[0,1], [0,-1], [1,0], [-1, 0]]

class Solution:
    def isEscapePossible(self, blocked: List[List[int]], source: List[int], target: List[int]) -> bool:
        

        queue = []
        my_blocked = set()
        blocked = {x*BASE+y for x, y in blocked}#二维转一维,高效查改

        def bfs(a, b):
            queue = [a]
            my_blocked = set()
            while len(queue) and len(my_blocked)<=MAX:
                x, y = queue.pop()
                if [x, y]==b:
                    return True
                for dirc in dircs:
                    nx, ny = x+dirc[0], y+dirc[1]
                    if nx < 0 or nx>=1e6 or ny < 0 or ny>=1e6:# 防止超过地图边界
                        continue
                    if nx*BASE+ny in blocked or nx*BASE+ny in my_blocked:#防止重复计数
                        continue
                    my_blocked.add(nx*BASE+ny) #防止重复计数
                    queue.append([nx, ny])
            return len(my_blocked)>MAX
        return bfs(target, source) and bfs(source, target)

测试与结果

我们可以通过几组测试用例来验证代码的正确性,例如:

  • 给定迷宫地图和起始点终止点坐标,判断是否存在可行的逃脱路径。
  • 考虑不同大小的迷宫和障碍物分布情况,观察算法的执行效率和准确性。

时间复杂度O(N^2)

空间复杂度O(N^2)

(N为len(blocked))

leetcode运行截图:

总结与展望

通过本篇博客,我们了解了如何使用 BFS 算法来解决逃脱路径判断问题。这种算法思想可以应用在许多实际场景中,如游戏中人物逃脱、路径规划等方面。未来,我们可以进一步优化算法,提高搜索效率,或者拓展到更复杂的迷宫问题中。

希望这篇博客能够帮助大家理解逃脱路径判断算法的实现方法。谢谢阅读!

详细题解

. - 力扣(LeetCode)


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

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

相关文章

【AI绘画·24年1月最新】Stable Diffusion整合包安装!解压即用--秋葉aaaki 大佬的作品,试用

前言 Stable Diffusion 之前费老大的劲部署安装&#xff0c;解决报错。搞完之后&#xff0c;突然发现有个现成集成包可以用&#xff0c;真是效率高到不行&#xff0c;今天搞下来试试 我电脑配置&#xff1a; CPU: 12th Gen Intel Core™ i7-12700F 2.10 GHz 内存32G&#xff0…

解决鸿蒙模拟器卡顿的问题

缘起 最近在学习鸿蒙的时候&#xff0c;发现模拟器非常卡&#xff0c;不要说体验到鸿蒙的丝滑&#xff0c;甚至到严重影响使用的程度。 根据我开发Android的经验和在论坛翻了一圈&#xff0c;最终总结出了以下几个方案。 创建模拟器 1、在DevEco Virtual Device Configurat…

【Go语言】Go语言中的指针

Go语言中的指针 变量的本质是对一块内存空间的命名&#xff0c;我们可以通过引用变量名来使用这块内存空间存储的值&#xff0c;而指针则是用来指向这些变量值所在内存地址的值。 注&#xff1a;变量值所在内存地址的值不等于该内存地址存储的变量值。 Go语言中&#xff0c;…

vue3+vite+ts配置多个代理并解决报404问题

之前配置接口代理总是报404,明明接口地址是对的但还是报是因数写法不对;用了vue2中的写法 pathRewrite改为rewrite 根路径下创建env文件根据自己需要名命 .env.development文件内容 # just a flag ENVdevelopment# static前缀 VITE_APP_PUBLIC_PREFIX"" # 基础模块…

Dockerfile(2) - LABEL 指令详解

LABEL 可以为生成的镜像添加元数据标签信息&#xff0c;这些信息可以用来辅助过滤出特定镜像 LABEL <key><value> <key><value> <key><value> ... 栗子一 # key 加了 " LABEL "com.example.vendor""ACME Incorpor…

【活动】前端世界的“祖传代码”探秘:从古老魔法到现代重构

作为一名前端工程师&#xff0c;我时常在项目中邂逅那些被岁月打磨过的“祖传代码”。它们就像古老的魔法书页&#xff0c;用HTML标签堆砌起的城堡、CSS样式表中的炼金术&#xff0c;以及JavaScript早期版本中舞动的符咒。这些代码承载着先驱们的探索精神和独特智慧&#xff0c…

postman测试接口

1、postman测试接口 &#xff08;1&#xff09;首先安装postman 下载地址&#xff1a;Download Postman | Get Started for Free 选择对应版本下载&#xff0c;然后安装即可 &#xff08;2&#xff09;使用postman发送请求 比如以下这个请求例子&#xff1a; 使用postman发…

ArmV8架构

Armv8/armv9架构入门指南 — Armv8/armv9架构入门指南 v1.0 documentation 上面只是给了一个比较好的参考文档 其他内容待补充

Rocky Linux 运维工具 firewall-cmd

一、firewall-cmd​的简介 ​​firewall-cmd​是基于firewalld的防火墙管理工具。用户可以使用它来配置、监控和管理防火墙规则&#xff0c;包括开放端口、设置服务规则等。 二、firewall-cmd​​的参数说明 序号参数描述1​​–zone指定防火墙区域2–add-portxxx/tcp允许特定…

【查漏补缺你的Vue基础】Vue数据监听深度解析

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【笔记】:更方便的将一个List中的数据传入另一个List中

这里是 simpleInfoList 集合&#xff0c;记为集合A&#xff08;传值对象&#xff09; List<CourseSimpleInfoDTO> simpleInfoList courseClient.getSimpleInfoList(courseIds);if(simpleInfoListnull){throw new BizIllegalException("当前课程不存在!");}这…

深度学习与神经网络:构建智能系统的基石

一、引言 1、介绍深度学习和神经网络的背景和发展历程 深度学习和神经网络的背景和发展历程可以追溯到上世纪40年代和50年代的人工神经网络研究。当时&#xff0c;研究人员开始尝试模拟生物神经元之间的连接方式&#xff0c;构建了早期的神经网络模型。然而&#xff0c;由于计…

【Redis】深入理解 Redis 常用数据类型源码及底层实现(5.详解List数据结构)

本文是深入理解 Redis 常用数据类型源码及底层实现系列的第5篇&#xff5e;前4篇可移步(&#xffe3;∇&#xffe3;)/ 【Redis】深入理解 Redis 常用数据类型源码及底层实现&#xff08;1.结构与源码概述&#xff09;-CSDN博客 【Redis】深入理解 Redis 常用数据类型源码及底…

“智农”-大棚可视化

基于自主可控的数字孪生技术、物联网技术、大数据技术&#xff0c;构建全流程的新型农业一体化管理平台&#xff0c;围绕产运销管理全流程&#xff0c;实现生产->存储->包装->运输->销售的全链条管理。融合农业数据管理、农业数据预警显示、多维数据综合显示、农产…

IDEA基础——Maven配置tomcat

配置方案 一、配置maven-tomcat plugin插件&#xff08;只最高支持到tomcat 8&#xff09;~~1.添加镜像源&#xff0c;获取tomcat 8插件配置~~~~1.1 在pom.xml里先添加镜像源~~~~1.2 添加tomcat插件配置~~ 2. 添加tomact官方发布的插件配置&#xff08;无需添加镜像源&#xff…

从 0 到 1 搭建亿级商品 ES 搜索引擎

建设并维护一个亿级的搜索引擎并非易事&#xff0c;也不存在一劳永逸的最优治理方法。本文是在实践中不断学习和总结的成果&#xff0c;介绍了如何搭建一个可支持从千万级到亿级商品量级的搜索系统&#xff0c;并实现查询总 QPS 从百级增长到千级&#xff0c;写入总 QPS 从百级…

数据卷(Data Volumes) 自定义镜像(dockerfile)

目录 一. 数据卷&#xff08;Data Volumes&#xff09; 1.1 什么是数据卷 1.2 为什么需要数据卷 1.3 数据卷的作用 1.4 数据卷的使用 二. 自定义镜像&#xff08;dockerfile&#xff09; 2.1 什么是dockerfile 2.2 自定义centos 2.3 自定义tomcat 一. 数据卷&#xff08;Data…

【学习记录】HC32F460USB——U盘IAP升级app

从头开始&#xff0c;万物从解压开始 直奔猪蹄&#xff0c;找到usb下的工程文件 开始移植 主要移植IAP的boot和fatfs的文件系统&#xff0c;fatfs官网去下载ff15.0版本&#xff0c;目前用这个 放到项目里 添加到工程文件中 改引脚&#xff0c;给USB放电 编译&#xff0c;可以…

java自动化之自动化框架项目(第三天-测试数据注入到测试方法)

接第二天 1.实现目标 这里我们是数据驱动方式&#xff0c;把数据注入到测试方法&#xff0c;在测试方法中就可以获取对象中的数据。 2.注入测试数据 上一篇我们已经把用例数据封装到对象并放到list中&#xff0c;这里我们把用例对象list中的对象分别放到Object类型的一维数…

element-upload 文件上传和图片上传

文件上传 element-upload介绍实际上的文件上传代码前端java后端 补充 element-upload介绍 element-ui是一个很常用的文件上传组件&#xff0c;他包括但不局限于只上传图片&#xff0c;很多时候用于系统的头像修改就是用这个组件 在官网element-ui&#xff08;element-upload&a…