AcWing——方格迷宫(有点不一样的迷宫问题)
4943. 方格迷宫 - AcWing题库
1、题目
给定一个 n 行 m 列的方格矩阵。
行从上到下依次编号为 1∼n,列从左到右依次编号为 1∼m。
第 i 行第 j 列的方格表示为 (i,j)。
矩阵中的方格要么是空地(用 .
表示),要么是陷阱(用 #
表示)。
初始时,你位于方格 (x₁,y₁),你需要前往方格 (x₂,y₂)。
每次移动,你可以任选上、下、左、右四个方向之一,并沿该方向移动 1∼k 步。
从一个方格移动至相邻方格视为一步。
但是,你要保证在你的移动过程中不能走出矩阵,也不能进入陷阱方格。
请你计算从方格 (x₁,y₁) 移动至方格 (x₂,y₂),所需要的最少移动次数。
保证方格 (x₁,y₁) 和方格 (x₂,y₂) 都是空地。
方格 (x₁,y₁) 和方格 (x₂,y₂) 可能是同一个方格。
注意:注意区分本题中移动次数与移动步数的区别。
输入格式
第一行包含三个整数 n,m,k。
接下来 n 行,每行包含 m 个字符,其中第 i 行第 j 个字符,要么是 .
,表示方格 (i,j) 是空地;要么是 #
,表示方格 (i,j) 是陷阱。
最后一行包含四个整数 x₁,y₁,x₂,y₂。
输出格式
一个整数,表示所需要的最少移动次数。
如果无法从方格 (x₁,y₁) 移动至方格 (x₂,y₂),则输出 -1
。
数据范围
前 6 个测试点满足 1≤n,m≤10。
所有测试点满足 1≤n,m,k≤1000,1≤x₁,x₂≤n,1≤y₂,y₂≤m。
输入样例1:
3 4 4
....
###.
....
1 1 3 1
输出样例1:
3
输入样例2:
3 4 1
....
###.
....
1 1 3 1
输出样例2:
8
输入样例3:
2 2 1
.#
#.
1 1 2 2
输出样例3:
-1
2、题目解读
走迷宫_牛客题霸_牛客网 (nowcoder.com)
牛客网这题就是正常,普通求解最短步数的迷宫问题,而这题添加了一个条件:每次移动,你可以任选上、下、左、右四个方向之一,并沿该方向移动 1∼k 步。这称为 一次移动。
我们使用BFS去正常解答这道题目时间复杂度为O(nmk)最大为10⁹,这就会超时。
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;public class Main {static int n,m,k,x1,x2,y1,y2;static char[][] ch;static int[][] move ={{0,1},{0,-1},{1,0},{-1,0}};//四个方向,偏移量static int inf=0x3f3f3f3f;//初始化移动次数static int[][] ans;//记录移动次数public static void main(String[] args){Scanner sc=new Scanner(System.in);n=sc.nextInt();m=sc.nextInt();k=sc.nextInt();ch =new char[n][];ans =new int[n][m];for(int i=0;i<n;i++){ch[i]=sc.next().toCharArray();}x1=sc.nextInt()-1;y1=sc.nextInt()-1;x2=sc.nextInt()-1;y2=sc.nextInt()-1;for(int i=0;i<n;i++){//初始化移动次数Arrays.fill(ans[i],inf);}System.out.println(bfs());}public static int bfs(){ans[x1][y1]=0;Queue<int[]> q=new LinkedList<>();q.add(new int[]{x1,y1,0});while(!q.isEmpty()){int[] a =q.poll();for(int[] mo :move){//四个方向for(int i=1;i<=k;i++){//移动一次:移动1-k步int x=a[0]+mo[0]*i,y=a[1]+mo[1]*i;if(x<0||x==n||y<0||y==m||ch[x][y]=='#'){//不能出去,不能跨越陷阱break;}if(ans[x][y]>a[2]+1){//修改移动次数ans[x][y]=a[2]+1;q.add(new int[]{x,y,a[2]+1});}}}}//走完整个地图,判断目的地是否可以走到return ans[x2][y2]==inf?-1:ans[x2][y2];}
}
我们需要优化代码,看下面图:
所以我们应该 更新到格子发现不是最优,就应该停止。这样时间复杂度就退化到了O(nm)
需要在判断条件处新加:ans[x][y]<a[2]+1
3、代码
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;public class Main {static int n,m,k,x1,x2,y1,y2;static char[][] ch;static int[][] move ={{0,1},{0,-1},{1,0},{-1,0}};//四个方向,偏移量static int inf=0x3f3f3f3f;//初始化移动次数static int[][] ans;//记录移动次数public static void main(String[] args){Scanner sc=new Scanner(System.in);n=sc.nextInt();m=sc.nextInt();k=sc.nextInt();ch =new char[n][];ans =new int[n][m];for(int i=0;i<n;i++){ch[i]=sc.next().toCharArray();}x1=sc.nextInt()-1;y1=sc.nextInt()-1;x2=sc.nextInt()-1;y2=sc.nextInt()-1;for(int i=0;i<n;i++){//初始化移动次数Arrays.fill(ans[i],inf);}System.out.println(bfs());}public static int bfs(){ans[x1][y1]=0;Queue<int[]> q=new LinkedList<>();q.add(new int[]{x1,y1,0});while(!q.isEmpty()){int[] a =q.poll();for(int[] mo :move){//四个方向for(int i=1;i<=k;i++){//移动一次:移动1-k步int x=a[0]+mo[0]*i,y=a[1]+mo[1]*i;//不能出去,不能跨越陷阱,还有更新到格子发现不是最优,就应该停止if(x<0||x==n||y<0||y==m||ch[x][y]=='#'||ans[x][y]<a[2]+1){break;}if(ans[x][y]>a[2]+1){//修改移动次数ans[x][y]=a[2]+1;q.add(new int[]{x,y,a[2]+1});}}}}//走完整个地图,判断目的地是否可以走到return ans[x2][y2]==inf?-1:ans[x2][y2];}
}
相关文章:

AcWing——方格迷宫(有点不一样的迷宫问题)
4943. 方格迷宫 - AcWing题库 1、题目 给定一个 n 行 m 列的方格矩阵。 行从上到下依次编号为 1∼n,列从左到右依次编号为 1∼m。 第 i 行第 j 列的方格表示为 (i,j)。 矩阵中的方格要么是空地(用 . 表示),要么是陷阱…...

《常规脉搏传输时间作为人体血压变化标志》阅读笔记
目录 一、论文摘要 二、论文十问 Q1: 论文试图解决什么问题? Q2: 这是否是一个新的问题? Q3: 这篇文章要验证一个什么科学假设? Q4: 有哪些相关研究?如何归类?谁是这一课题在领域内值得关注的研究员? …...

java学习之异常三
目录 一、throws 一、基本说明 二、使用细节 二、自定义异常 一、 基本概念 编辑二、自定义异常的步骤 三、实例 四、练习 三、throw和throws的区别 四、本章作业 第一道 第二题 第三题 第四题 一、throws 一、基本说明 package com.hspedu.throws_;import java.i…...
生产者向 Kafka 发送消息的执行流程
(1)生产者要往 Kafka 发送消息时,需要创建 ProducerRecoder,代码如下: ProducerRecord<String,String> record new ProducerRecoder<>("CostomerCountry","Precision Products","Fr…...

Linux命令·netstat
netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UDP监听,进程内存管理的相关报告。 如果你的计算机有时候…...
《心安即是归处》读书笔记
目录 作者简介 经典摘录 一个人活在世界上,必须处理好三个关系 什么叫人生呢? 谈一下人性的问题 了解人生的意义与价值 人生之美 评断一本书的好与坏有什么标准呢? 知足知不足 作者简介 季羡林,随便查询一下作者简介&…...

C++:使用红黑树封装map和set
目录 一. 如何使用一颗红黑树同时实现map和set 二. 红黑树的节点插入操作 三. 红黑树迭代器的实现 3.1 begin()和end() 3.2 operator和operator-- 3.3 红黑树迭代器实现完整版代码 四. map和set的封装 附录:用红黑树封装map和set完整版代码 1. RBTree.h文件…...
Go 命令
目录 文章目录 go buildgo cleango fmtgo getgo installgo testgo toolgo generategodoc其它命令 go build 这个命令主要用于编译代码。在包的编译过程中,若有必要,会同时编译与之相关联的包。 如果是普通包,就像我们在1.2节中编写的mymath包…...
LEO、HW、LSO、LW 分别代表什么?
LEO :是 LogEndOffset 的简称,代表当前日志文件中下一条。HW:水位或水印一词,也可称为高水位 (high watermark) ,通常被用在流式处理领域 (flink、spark) ,以表征元素…...
问题 B: 跳石头(C++)(二分答案)
目录 1.题目描述 2.AC 1.题目描述 问题 B: 跳石头 时间限制: 1.000 Sec 内存限制: 128 MB提交 状态 题目描述 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点…...

bugku——变量1
拿到题目后是一串PHP代码,给到提示是flag在变量中,接下来进行代码审计 error_reporting(0):关闭错误报告 include “flag1.php”:包含flag1.php文件 highlight_file(_file_):页面进行语法高亮显示 isset($_GET[‘args’])…...

网络数据包丢失监控
什么是网络数据包 数据包或网络数据包是通过网络传输的小数据单元。顾名思义,这些是小的、离散的数据单元。单独来看,这些单位不一定有多大意义。它们只是正在传输的整体消息的一部分,这些消息已被组装成多个层。但是,当组合在一…...

Linux服务器安装部署MongoDB数据库 - 无公网IP远程连接
目录 前言 1. 配置Mongodb源 2. 安装MongoDB 3. 局域网连接测试 4. 安装cpolar内网穿透 5. 配置公网访问地址 6. 公网远程连接 7. 固定连接公网地址 8. 使用固定地址连接 转载自Cpolar Lisa文章:Linux服务器安装部署MongoDB数据库 - 无公网IP远程连接「内网…...
CSS面试题:30道含答案和代码示例的练习题
什么是 CSS?它的作用是什么? CSS(层叠样式表)是一种用于描述网页样式的语言。它的作用是控制网页的布局、字体、颜色、背景等方面的样式。如何在 HTML 页面中引入 CSS? 可以使用 标签将 CSS 文件引入到 HTML 页面中。例…...

时间轮的golang实践浅析
引言 下列代码模仿一段RPC请求的执行过程,执行后会有哪些问题: RPC代码示例答案:因为超时控制后未阻断后续请求,导致并发读写产生Panic思考:客户端发起 HTTP 请求后,如果在指定时间内没有收到服务器的响应…...
Linux命令_stress 快速模拟CPU、内存、磁盘消耗
ping的安装命令:apt-get install -y inetutils-ping 会遇到Unable to locate package inetutils-ping问题 正确的操作是: ** 这时候需要敲:apt-get update,这个命令的作用是:同步 /etc/apt/sources.list 和 /etc/apt/…...
可视化绘图技巧100篇分析篇(二)-生存曲线(LM曲线)
目录 前言 几个高频面试题目 roc曲线和生存曲线区别 生存曲线模型 生存曲线组件讲解...

UP主发车啦!撩人仙侠文系列,谁来管管这个反派啊!
本人书龄4年,平时很爱看小说,阅遍无数经典修仙文,熬夜党的最爱啊!!!!我心中的仙侠top,都是我的心头爱。 一般我都会跟朋友说这六本五星级仙侠好文,如果她们不看…...

K8S使用持久化卷存储到NFS(NAS盘)
参考文章:K8S-v1.20中使用PVC持久卷 - 知乎 目录 1、概念: 1.1 基础概念 1.2 PV的配置 1.2.1 静态PV配置 1.2.2 动态PV配置 1.2.3 PVC与PV的绑定 1.2.4 PVC及PV的使用 2 部署PV及PVC 2.1 所有K8S机器都需要安装NFS程序 2.2 仅针对需要暴露文件…...

一图看懂 multidict 模块:类似于字典的键值对集合,键可以多次出现,资料整理+笔记(大全)
本文由 大侠(AhcaoZhu)原创,转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 multidict 模块:类似于字典的键值对集合,键可以多次出现,资料整理笔记(大全) 🧊摘要🧊模…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...