【洛谷P2802】回家

搜索play的第三弹!

回家

题目描述

小 H 在一个划分成了 \(n \times m\) 个方格的长方形封锁线上。 每次他能向上下左右四个方向移动一格(当然小 H 不可以静止不动), 但不能离开封锁线,否则就被打死了。 刚开始时他有满血 \(6\) 点,每移动一格他要消耗 \(1\) 点血量。一旦小 H 的血量降到 \(0\), 他将死去。 他可以沿路通过拾取鼠标(什么鬼。。。)来补满血量。只要他走到有鼠标的格子,他不需要任何时间即可拾取。格子上的鼠标可以瞬间补满,所以每次经过这个格子都有鼠标。就算到了某个有鼠标的格子才死去, 他也不能通过拾取鼠标补满 HP。 即使在家门口死去, 他也不能算完成任务回到家中。

地图上有五种格子:

0:障碍物。

1:空地, 小 H 可以自由行走。

2:小 H 出发点, 也是一片空地。

3:小 H 的家。

4:有鼠标在上面的空地。

小 H 能否安全回家?如果能, 最短需要多长时间呢?

输入格式

第一行两个整数 \(n,m\), 表示地图的大小为 \(n \times m\)

下面 \(n\) 行, 每行 \(m\) 个数字来描述地图。

输出格式

一行, 若小 H 不能回家, 输出 -1,否则输出他回家所需最短时间。

样例 #1

样例输入 #1

3 3
2 1 1
1 1 0
1 1 3

样例输出 #1

4

提示

对于所有数据,\(1 \le n,m \le 9\)

2021.9.2 增添一组 hack 数据 by @囧仙

解法&个人感想

这题不可能是橙题啊喂!我调的都想不做了!
而且题解还打不开!
列举一下这题的坑点吧
首先:卡DFS DFS的point 1必定TLE
然后:因为可能反复经过某个鼠标格子从而回满血,所以vis不止是0和1
那应该是什么呢?想了很久发现 因为vis和step是独立的 vis只针对能不能到这回事
然后ans只要到了才更新(所以得先满足到了吧!)
因此 vis应该记录到当前格子的最大生命(如果小于就回溯 不然怎么到得了嘛)
下面看代码吧!

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,m;
int ma[11][11];
int vis[11][11];
int dx[5]={0,0,0,1,-1},dy[5]={0,1,-1,0,0};
int sx,sy,fx,fy;
const int INF=1e9;
int ans=INF;//ans赋大值来看它是否变化
struct node{int x,y,t,b;
};
void bfs(){queue<node>q;q.push(node{sx,sy,0,6});vis[sx][sy]=6;.//这个别忘了while(!q.empty()){int ax=q.front().x,ay=q.front().y;int ab=q.front().b,at=q.front().t;if(ab==0||at>=ans||at>=n*m){q.pop();continue;}if(ma[ax][ay]==4){ab=6;}if(ax==fx&&ay==fy){ans=min(ans,at);q.pop();continue;}for(int i=1;i<=4;i++){int tx=ax+dx[i],ty=ay+dy[i];if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&ab-1>vis[tx][ty]&&ma[tx][ty]!=0){vis[tx][ty]=ab-1;q.push(node{tx,ty,at+1,ab-1});}}q.pop();}//我们重点看这里的回溯位置 就是直接出队然后continue 从而正常出队应该放后面(以前没见过)return ;
}
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){scanf("%d",&ma[i][j]);if(ma[i][j]==2){ma[i][j]=1;sx=i,sy=j;}if(ma[i][j]==3){ma[i][j]=1;fx=i,fy=j;}}}bfs();if(ans==INF){cout<<-1;}else cout<<ans;system("pause");return 0;
}

  

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

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

相关文章

DeepSeek LLM

一、背景动机开源社区的关注点:LLaMA 之后,开源社区主要关注训练固定规模的高质量 LLM(如 7B、13B、34B 和 70B),而对 LLM 的缩放定律研究探索较少。缩放定律的重要性:当前开源 LLM 仍处于 AGI 发展的初期阶段,因此研究扩展定律对于未来发展至关重要。缩放结论的分歧:早…

24-25Web开发技术#SpringBoot综合项目实战e1

选用IntelliJ IDEA Community Edition 2024.2 将reggie作为项目(Project)打开 开发环境搭建 系统开发及运行环境 JDK安装尽量遵循原项目的配置,在Oracle官网下载JDK11需注册Oracle账户,较麻烦。 在https://jdk.java.net/archive/找到11 GA (build 11+28)下载Windows版本的压缩…

星球助手发布更新v1.4.0

星球助手发布更新v1.4.0,重要的更新内容有 ​添加了展示评论的功能,可复制评论内容,可展示图片 添加下载评论中的图片的功能 修复了帖子文字展示不全的问题 修复了问答帖子无法搜索的问题 修复了当帖子有多张图片时无法完整显示图片的问题 修复了下载用户信息报错的问题 修复…

CTF-web-POST

1.照样是打开题目链接2.翻译源代码,仍然是向url添加“?what=flag” 3.但是这题需要用hackbar添加4.得到flag

7.机房预约系统

机房预约系统。需求文件目录代码 机房预约系统.cpp #include<iostream> #include "Identity.h" #include<fstream> #include<string> #include "globalFile.h" #include "student.h" #include "teacher.h" #include…

CTF-web-GET

1.打开题目2.翻译原代码,要求添加"?what=flag"3.得到flag:flag{0e8b036fa161804be74c7f33161dc451}

JFrog Artifactory 系列6 --- 其他配置

一、概览 1. 承上启下 JFrog Artifactory 系列 二、其他配置 1. Token过期时间三、参考 https://jfrog.com/help/r/artifactory-intermittent-403-errors-while-working-with-artifactory

新春“码”启 | Cocos 3D 开发微信小游戏(第4天):游戏资源设计和框架核心源代码

新春开发 Cocos 3D 微信小游戏计划的第 4 天,包括游戏资源设计建议,如 UI 背景自适应、碰撞检测组件选用;游戏控制逻辑设计方面,包括组件层级管理及核心代码框架,还有配置中心和消息中心代码,所有的资源与代码均可免费下载……放飞自我的时光总是过得很快,一晃春节就过去…

动手学大模型应用开发,第2天:调用大模型(下)

五、调用智谱 AI 1. ChatGLM 大模型 智谱 AI 是由清华大学计算机系技术成果转化而来的公司,致力于打造新一代认知智能通用模型。公司合作研发了双语千亿级超大规模预训练模型 GLM-130B,并构建了高精度通用知识图谱,形成数据与知识双轮驱动的认知引擎,基于此模型打造了 Chat…

《浅谈树拓扑序计数相关问题的一些方法》阅读笔记

才发现原来我不会拓扑序计数。临时补一下。树拓扑序计数 叶向树拓扑序计数 朴素的做法是 dp 然后归纳,但是论文给出了新解释。 考察一个简单的拓扑序生成方式:你有一个集合,初始为空,每次选择树中不在集合里的一个点,取它最浅的不在集合里的点,加入集合,重复操作 \(n\) …

MyBatis之万能的map

在映射的mxl文件中写sql语句时,可以将parameterType设置为map,这样就可以想传什么就传什么,废话不多说,上代码 insertUser2和insertUser的区别是,前者传递的是map,后者传递的是User类,如果User类的属性很多的话,后者这种传递方式需要定义一个对象,并且实现每一个属性…

昆明理工大学计算机25考研面试真题

--昆工昆明理工大学计算机技术人工智能软件工程网络空间安全计算机系统结构计算机软件与理论计算机应用技术网络与信息安全408考研综合程序设计891计算机专业核心综合数据库系统原理