【算法】逃离大迷宫

题目信息

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

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

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

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

0 <= blocked.length <= 200

题目解析

很容易让人想到用dfs或bfs遍历所有格子,来确定能否到达终点,但此题的数据范围太大,10^6大概率会超时,所以需要另辟蹊径。

题目告诉我们blocked.length在[0,200] , 所以说大部分的位置都是空的,可以走的,那什么情况下无法赶往目标方格呢,就是入口或出口被分别包围起来了。

那我们只要证明,入口和出口没有被包围,就可以说明一定可以从源点走到目标点的。

那么怎么确认有没有被包围,就是我们要解决的问题了:

由题目可知,blocked的大小最多只有200个,而大迷宫是个10^6 * 10^6的超大迷宫,所以最大面积只能是它作为一条斜边依赖于两个墙角。

如果你不能理解,代码里的MAX也是可以设置为200 * 200(甚至是1e5),假设了超过blocked的个数一倍的大小。

之后,利用bfs的方式,分别判断入口和出口有没有被包围即可!

代码

class Solution {
public:int EDGE = 1e6 , MAX = 1e5;int BASE = 131;unordered_set<long long> set;int dir[4][2] = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} };bool isEscapePossible(vector<vector<int>>& blocked, vector<int>& s, vector<int>& t) {int n = blocked.size();for(auto& p : blocked)set.insert(p[0]*BASE+p[1]);MAX = n * (n-1) / 2;return check(s,t) && check(t,s);}bool check(vector<int>& a, vector<int>& b){unordered_set<long long> vis;queue<pair<int,int> > q;q.push({a[0],a[1]});while(q.size() > 0 && vis.size() <= MAX){auto t = q.front();q.pop();int x = t.first, y = t.second;if(x == b[0] && y == b[1]) return true;vis.insert(x * BASE + y);for(int i = 0;i<4;i++){int nx = x + dir[i][0], ny = y + dir[i][1];if(nx < 0 || nx >= EDGE || ny < 0 || ny >= EDGE){continue;}if(set.count(nx * BASE + ny)) continue;if(vis.count(nx * BASE + ny)) continue;q.push({nx , ny});vis.insert(nx * BASE + ny);}}return vis.size() > MAX;}
};

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

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

相关文章

【软件测试】用例篇 -- 详解

一、测试用例的基本要素 测试用例&#xff08;Test Case&#xff09;是为了实施测试而向被测试的系统提供的一组集合&#xff0c;这组集合包含&#xff1a;测试环境、操作步骤、测试数据、预期结果等要素。&#xff08;注意&#xff1a;不需要执行结果&#xff0c;因为执行结果…

IO 5.8日

1&#xff1a;使用 dup2 实现错误日志功能 使用 write 和 read 实现文件的拷贝功能&#xff0c;注意&#xff0c;代码中所有函数后面&#xff0c;紧跟perror输出错误信息&#xff0c;要求这些错误信息重定向到错误日志 err.txt 中去 2&#xff1a;判断一个文件是否拥有用户可写…

python在Django中实现文件上传功能主要涉及几个步骤

在Django中实现文件上传功能主要涉及几个步骤。以下是一个基本的指南,用于在Django应用程序中设置文件上传: 设置模型 首先,你需要在模型中定义一个FileField或ImageField。对于图像,ImageField更为合适,因为它包含对图像大小调整和其他图像相关功能的验证。 python 复…

OpenFeign 定义后备工厂进行服务降级

OpenFeign 定义后备工厂进行服务降级可以使得远程接口调用失败时进行降级处理&#xff0c;而不会直接报错&#xff0c;影响后续代码逻辑。定义后备工厂的步骤如下&#xff1a; 远程接口处定义。 FeignClient(value ServiceConstants.SYSTEM, fallbackFactory RemoteFileFallb…

Android单行字符串末尾省略号加icon,图标可点击

如图 设置仅显示单行字符串&#xff0c;末尾用省略号&#xff0c;加跟一个icon&#xff0c;icon可点击 tvName.text "test"val drawable ResourcesCompat.getDrawable(resources, R.mipmap.icon_edit, null)tvName.setCompoundDrawablesWithIntrinsicBounds(null,…

【如此简单!数据库入门系列】之无序不代表混乱 -- 堆文件

文章目录 前言堆文件链表实现页目录实现总结系列文章 前言 还记得上次遗留的问题吗&#xff1f; 以什么组织方式将数据保存在磁盘中&#xff1f; 今天我们接着讨论这个问题。 首先想一个问题&#xff1a;有一天&#xff0c;你开着自己心爱的大型SUV去超市购物。在停车场入口看…

威客网上招标系统(五)

目录 5 详细设计 5.1 系统首页 5.1.1系统首页&#xff08;网站首页index.jsp&#xff09; 5.1.2 下沙派威客网首页界面说明 5.2 站内新闻信息 5.2.1站内新闻操作界面 5.2.2系统主操作界面说明 5.3威客在线操作界面 5.3.1 威客在线操作界面 5.3.2威客在线说明 5.4系统…

langchain 数据向量化存储

中文向量化模型候选&#xff1a; 1、sentence-transformers/all-MiniLM-L6-v2 2、BAAI/bge-m3 3、多语言模型&#xff1a;BAAI/bge-m3 支持的输入长度<8192 from langchain_community.embeddings import HuggingFaceBgeEmbeddings model_name "sentence-transforme…

文件IO-使用dup2实现错误日志功能及判断文件权限,并终端输出

1&#xff1a;使用 dup2 实现错误日志功能 使用 write 和 read 实现文件的拷贝功能&#xff0c;注意&#xff0c;代码中所有函数后面&#xff0c;紧跟perror输出错误信息&#xff0c;要求这些错误信息重定向到错误日志 err.txt 中去 代码&#xff1a; #incl…

CP AUTOSAR之AUTOSAR OS详细说明(二)(正在更新中)

本文遵循autosar标准:R22-11 1 - 7章请参阅 CP AUTOSAR之AUTOSAR OS详细说明(一): https://blog.csdn.net/sehanlingfeng/article/details/138585435 8 API规范 本章包含操作系统提供的API。请注意,并非所有服务都适用于所有可伸缩性类别,并且某些服务的行为针对特定可…

kubectl_入门_Pod控制器

Pod控制器 在k8s中&#xff0c;按照pod的创建方式可以将其分为两类 自主式pod&#xff1a;k8s直接创建出来的pod&#xff0c;这种pod删除后就没有了&#xff0c;也不会重建控制器创建的pod&#xff1a;通过控制器创建的pod&#xff0c;这种pod删除了之后还会自动重建 1. 什么…

一张贴纸50万,炒房炒币的怎么都来炒CSGO皮肤了

一张贴纸50万&#xff0c;为什么炒房炒币的都来炒CSGO饰品了&#xff1f; 一张贴纸50万&#xff0c;炒房炒币的怎么都来炒CSGO皮肤了&#xff1f; 经常有人问我&#xff0c;天天看你们买卖装备&#xff0c;买卖皮肤&#xff0c;说到底这都是虚拟产品&#xff0c;看得见摸不着的…

Java与C语言的对比及其应用场景

Java和C语言在多个方面存在显著的差异&#xff0c;这些差异不仅体现在它们的语法、特性和性能上&#xff0c;还体现在它们的应用场景上。以下是关于这两种语言的详细对比&#xff1a; 一、语言特性 Java&#xff1a;Java是一种面向对象的高级编程语言&#xff0c;它强调代码的…

Java_从入门到JavaEE_11

一、抽象类及抽象方法 1.认识抽象类及抽象方法 应用场景&#xff1a;当一个方法必须在父类中出现&#xff0c;但是这个方法又不好实现&#xff0c;就把该方法变成抽象方法&#xff0c;交给非抽象的子类去实现 实例&#xff1a; //抽象类 public abstract class 类名{//抽象方…

element-ui table sortable排序 掉后端接口方式

实例: 官方解释:如果需要后端排序&#xff0c;需将sortable设置为custom&#xff0c;同时在 Table 上监听sort-change事件&#xff0c;在事件回调中可以获取当前排序的字段名和排序顺序&#xff0c;从而向接口请求排序后的表格数据。 1.table上要加 sort-change"sortCha…

鸿蒙OpenHarmony开发板:【子系统配置规则】

子系统 子系统配置规则 通过build仓下的subsystem_config.json可以查看所有子系统的配置规则。 {"arkui": {"path": "foundation/arkui", # 路径"name": "arkui" # 子系统名},"ai": {&q…

【Keil程序大小】Keil编译结果Code-RO-RW-ZI分析

【Keil程序大小】Keil编译结果Code-RO-RW-ZI分析 下图为keil编译后的结果&#xff1a; 单位为Byte。Code是程序大小。RO是常量大小。RW是读写变量占用大小&#xff0c;如已初始化的静态变量和全局变量。ZI是全零变量占用大小&#xff0c;如未初始化的static修饰的静态变量、全局…

项目管理-项目绩效域2/2

项目管理&#xff1a;每天进步一点点~ 活到老&#xff0c;学到老 ヾ(◍∇◍)&#xff89;&#xff9e; 何时学习都不晚&#xff0c;加油 八大绩效域包括&#xff1a;“团干部 策划开公交” 团队、干系人、不确定性、测试、规划、开发方法与生命周期、项目工作、交付。 上节…

在全志H616核桃派1B开发板Python进行GPIO按键功能实现

前言​ 按键是最简单也最常见的输入设备&#xff0c;很多产品都离不开按键&#xff0c;包括早期的iPhone&#xff0c;今天我们就来学习一下如何使用Python来编写按键程序。有了按键输入功能&#xff0c;我们就可以做很多好玩的东西了。 实验目的​ 编程实现按键输入检测。 …

Python从0到POC编写--SQL注入

SQL注入POC编写。 环境&#xff1a; win10 &#xff0c;phpStudy &#xff0c;python3.7 &#xff0c;sqli-labs 虚拟域名&#xff1a; www.sql.com 简单的POC&#xff1a; 说起来也简单&#xff0c; 就是请求–>响应&#xff0c; 然后再判断返回信息是否存在注入。 本…