HDOJ 1072 Nightmare

题意:

给你一幅nXm的地图,其中‘0’是不能走的,‘1’是可以走的,‘2’是起点,‘3’是终点,

‘4’是可以重置时间的点,每次可以朝上下左右四个方向走,但不能超出地图范围,

走一步需要1秒的时间。

若能在炸弹爆炸前走出去,则输出最少的时间,否则输出-1。

最初炸弹的时间是6,倒计时6秒就会爆炸,炸弹的时间可在在地图上的‘4’处重置为6秒,

重置炸弹不需要时间。

若到‘4’时的时间为0,则不能重置时间;若到‘3’时的时间为0,则不能逃出。

 

题解:

这道题求最小步数,涉及到最小一般都是用bfs做,一般的bfs进队为了防止重走原来的路

都会记录路径然后以此判断是否走过,而这道题虽然求最小步数,但是是可能某一点重新

走过的(比如样例二),重新走过的条件是:走到此点比前一次走到这个点所剩余的时间

要多,这样重走才有价值。以这个条件判断入队!!

 

(这题不同于其他题的地方就是于虽然也是bfs,但对于走过的路径不能标记,因为可能还要走,注意题目要求:如果可以,可以走任意多遍。

这就引发了一个问题,如果不缩减搜索范围,怎么可能走得出来呢?应该说这题好就好在不是根据走过的路径来标记,而是根据前后两次踏

上同一位置是bomb离explode的时间长短来标记。简言之,如果第二次踏上一个位置,那么找出路已用的时间肯定是增加了,那为啥还要走上这条

路呢?唯一的追求就是bomb离爆炸的时间增大了。所以可以利用这个条件来标记了。每次在入队前检查下爆炸时间是否比上次在同一位置的大,若

是,则入队;反之,入队无意义了。详见代码。

从以上的分析中可以引出另一思路,也就是只要进入位置4,那么bomb就会延时到6分钟,最大的延时时间。换句话说,下次再进入该4位置,也

不会获得更大的延时时间了。所以,只要访问过位置4了,就可以直接标记为0位置,表明下次不可在访问。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <limits.h>
using namespace std;
typedef long long ll;
const int N = 10;
int n,m,time;
int dx[4]= {-1,0,0,1},dy[4]= {0,1,-1,0};
int mp[N][N],rec[N][N];
struct node
{
    int x,y,t,step;//剩余时间,步数
    /*friend bool operator<(const node a,const node b)//剩余时间越多越好
    {
        return a.t<b.t;//时间大的优先级高
    }*/
} start;
bool check(int x,int y)
{
    if(x>=0&&x<n&&y>=0&&y<m&&mp[x][y]!=0)//此点为1,2,3,4
        return true;
    return false;
}
void bfs()
{
    queue<node> que;
    node q2,q3;
    que.push(start);
    rec[start.x][start.y]=start.t=6;
    while(!que.empty())
    {
        node q1;
        q1=que.front();
        que.pop();
        for(int i=0; i<4; i++)
        {
            node q2;
            q2.x=q1.x+dx[i],q2.y=q1.y+dy[i];
            if(check(q2.x,q2.y))
            {
                q2.step=q1.step+1;
                q2.t=q1.t-1;
                if(mp[q2.x][q2.y]==3&&q2.t>=1)//找到出口
                {
                    printf("%d\n",q2.step);
                    return;
                }
                else if(mp[q2.x][q2.y]==4)//更改时间
                {
                    q2.t=6;
                }
                if(q2.t>1&&q2.t>rec[q2.x][q2.y])//这个地方很关键,入队的条件是剩余的时间大于
                {                               //之前走到此地所剩余的时间,这样重新走这个点才有意义
                    rec[q2.x][q2.y]=q2.t;
                    que.push(q2);
                }
            }
        }
    }
    printf("-1\n");
    return;
}
int main()
{
    freopen("HDOJ 1074in.txt","r",stdin);
    int T;
    scanf("%d",&T);
    while(T--)
    {
        memset(rec,0,sizeof(rec));
        scanf("%d%d",&n,&m);
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<m; j++)
            {
                scanf("%d",&mp[i][j]);
                if(mp[i][j]==2)
                {
                    start.x=i;
                    start.y=j;
                    start.t=6;
                    start.step=0;
                }//在起始位置,剩余6分钟
            }
        }
        bfs();
    }
    return 0;
}


 

(持续更新中!)详解【计算机类&面试真题】军队文职考试 ——第二期(真题+解析)| 网络协议的三个核心要素;交互式系统中的非剥夺策略;中断和陷入的区别;可变分区管理中的硬件机制;数据库系统的优点 本篇博客将讨论军队文职面试(计算机类)的几个关键问题。我们将介绍网络协议的核心要素(帮助你理解网络通信的基本原理)、交互式系统中的非剥夺策略(解释为何这是一个优秀的策略以及其对用户体验、系统稳定性和可预测性的影响)、中断和陷入的区别(从引起原因、处理机制、权限级别和应用等方面进行阐述)、可变分区管理的硬件机制以及数据库系统与文件系统的优点比较。通过阅读本文,您将深入了解这些话题,为面试准备和实际应用提供有价值的知识。 阅读详情

相关推荐

Fast-LIO2代码解析 古月居

FAST-LIO,FAST-LIO2与FASTER-LIO - 古月居FAST-LIO2代码解析(一) - 古月居FAST-LIO2代码解析(二) - 古月居FAST-LIO2代码解析(三) - 古月居FAST-LIO2代码解析(四) - 古月居FAST-LIO2代码解析(五) - 古月居FAST-LIO2代码解析(六) - 古月居

li4692625的博客 2783

hdoj1072,Nightmare

1.利用广搜。看到求最小值就这样做了 2.不能标记已经走过的。原来标记了,但是后来去掉了。可以看到node里面还有布尔值,但是下面没有用 3.但是利用前后两个点的时间剩余比较来代替了。这样在题目给出的第三个测试例子里是可以在走过4之后再   走走过的路,但是一般没有走过4就不行。 4.从文件读入读出也没有办到。一会看看。 5.第一次自己做出来题一次ac。 6.最小时间和剩余步数也是两个

kaka0930的博客 629

基于 Datawhale 开源量化投资学习指南(10):基于 LightGBM 的量化选股

通过本篇文章,我们深入探索了如何运用 LightGBM 机器学习模型实现量化选股。首先,我们通过获取股票的历史数据,进行特征工程和标签制作,将选股问题转化为一个分类问题。接着,我们使用 LightGBM 训练模型,并在验证集和测试集中评估了模型的表现。该选股策略的核心在于结合机器学习算法,从历史数据中寻找能够捕捉股票短期涨跌的关键特征,从而为投资者提供辅助决策支持。虽然本文的模型取得了一定的效果,但这只是量化投资领域的一小部分。

不想宅的冷同学 1346

HDU 1072(BFS)

Nightmare<br />Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)<br />Total Submission(s): 1960    Accepted Submission(s): 956<br /><br />Problem DescriptionIgnatius had a nightmare last night. He found himself in a labyri

-- bird -- 809

ARM架构实战:在鲲鹏920服务器上用Debian12部署PVE虚拟化平台

本文详细介绍了在基于ARM架构的华为鲲鹏920服务器上,以Debian 12为底层系统,部署Proxmox VE(PVE)虚拟化平台的完整实战流程。文章重点解析了ARM64架构下PVE软件源的配置、内核安装的注意事项、部署后网络与存储的调优,并提供了针对ARM虚拟化环境的性能优化建议,为在国产化硬件上构建稳定高效的虚拟化环境提供了宝贵经验。

efc12345678的博客 780

【数据集】waymo motion dataset介绍与数据解析可视化

waymo motion数据集下载,数据描述,数据特征和地图特征,数据解析并完成数据可视化

shuaixio的博客 5179

HDOJ-1072-Nightmare 解题报告

这是一道十分值得一做的

JZQT_T的博客 1242

保姆级教程:2026版Windows电脑换新,微信QQ聊天记录无损搬家(附路径修改避坑指南)

本文提供2026版Windows电脑换新时微信QQ聊天记录无损迁移的保姆级教程,涵盖最新版微信/QQ的存储路径修改和避坑指南。通过详细步骤和实战技巧,确保数据迁移过程中不丢失任何珍贵对话记录和文件,特别适合需要保留完整聊天记录的用户。

weixin_42629815的博客 2477

hdoj1072 Nightmare

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1072 /*题目大意: 某人走迷宫,从2处开始到3处终止,0是墙,1是空地。身上有定时炸弹,在第6min爆炸(只能走5步)。 4处是将定时炸弹重设的工具。问它最快能否逃出迷宫。 */ //此题题意允许每个格子走多次,那么需要其他标记来剪枝 //我使用visited[][]保存上次访问此点用时,如果当前

—— 然 之 894

故障处理:Oracle一体机磁盘故障时磁盘组重平衡失败的故障处理

摘要: Oracle Exadata一体机出现磁盘故障案例,存储节点故障灯未亮但磁盘已产生大量坏块,导致重平衡失败。文章强调了一体机硬件巡检需检查6个关键维度:节点messages日志、存储cell告警日志、CellCLI日志、ASM告警日志、ILOM日志及服务器信号灯。故障分析显示硬盘物理故障导致磁盘组冗余受损,自动修复流程受阻。文中详细记录了通过CellCLI工具排查损坏磁盘的过程,并提供了完整的故障处理流程和命令输出。文章同步发布于微信公众号"IT民工的龙马人生"和博客网站(www

提供数据库技术支持(系统优化,故障处理,安装升级,数据恢复等) 1231

手把手教你学simulink(57.2)--电励磁同步电动机场景示例:基于Simulink的矢量控制(Field-Oriented Control, FOC)电励磁同步电动机

在某电动汽车驱动系统中,采用了本项目开发的带有矢量控制功能的电励磁同步电动机驱动系统,结合三相逆变器实现了对电动机的高效控制。在某工业驱动系统中,采用了本项目开发的带有矢量控制功能的电励磁同步电动机驱动系统,结合三相逆变器实现了对电动机的精确控制。经过实际测试,该系统的应用使得生产效率提高了10%,并且在高负载条件下,电动机的温升得到了有效控制,延长了电动机的使用寿命。通过本项目的实施,我们成功配置了三相交流电源、三相逆变器和电励磁同步电动机的参数,并实现了对电动机的精确控制。

MHD0815的博客 944

HDUOJ 1072

HDUOJ 1072 Nightmare题意解析解决方案参考代码 题目来源 题意解析 Ignatius had a nightmare last night. He found himself in a labyrinth with a time bomb on him. The labyrinth has an exit, Ignatius should get out of the labyrinth before the bomb explodes. The initial exploding ti

错i 390

Linux ARM平台开发系列讲解(摄像头V4L2子系统) 2.12.5 V4L2 control的原理和实现

既然涉及到视频输入,就会有很多与 相关的效果,比如对比度、饱和度、色温、白平衡等等,这些都是通用的、必须的控制项,并且大多数仅需要设置一个整数值即可。 内核中已经为我们提供了这个控制类型的,我们只需要明确自己需要添加什么控制类型,然后将其添加进内核中即可。该部分摄像头代码一半厂家会提供驱动或者相对应的参数,否则没有图像处理知识很难开发出来。 返回总目录...

DSMGUOGUO的博客 1435

hdu1072 nightmare

hdu1072 nightmare ……跟hdu1242有些不同 走过的路可以返回 所以不要标记,换炸弹的倒计时限制队列的增长 #include #include #include using namespace std; int mp[10][10],m,n,Sx,Sy,Dx,Dy,flag,dir[4][2]={{0,1},{0,-1},{1,0},{-1,0

Time flies 765

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【HDU1072】Nightmare,思路+解题报告+代码

#include #include #include #include #include #define INPUT using namespace std; const int c0de4fun = 10; int x[4] = {1,-1,0,0}; int y[4] = {0,0,1,-1}; int maze[c0de4fun][c0de4fun]; /** Proble

c0de4fun的完美算(nei)法(he)教室-我们仍不知道,那天调用的驱动的名字。 1162

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

HDOJ-1072 Nightmare

66666666666666,看完答案代码后,第一次完全理解后自己敲出来BFS ,很激动 #include&lt;cstdio&gt; #include&lt;queue&gt; using namespace std; int map[20][20],vis[20][20],n,m,ex,ey,c,flag; int dx[4]={-1,1,0,0}; int dy[4]={0,0,-1,1...

0427-qzb的博客 314

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

HDOJ 1072 Nightmare(BFS)

Nightmare Problem Description Ignatius had a nightmare last night. He found himself in a labyrinth with a time bomb on him. The labyrinth has an exit, Ignatius should get out of the labyri

nudt_oys的博客 467

HDOJ--1072--Nightmare

题目描述: Ignatius had a nightmare last night. He found himself in a labyrinth with a time bomb on him. The labyrinth has an exit, Ignatius should get out of the labyrinth before the bomb explodes. The in...

猩猩是个好程序员的博客 210

hdoj-【1072 Nightmare】

Nightmare Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 10282    Accepted Submission(s): 5016 Problem Description Ignatius had a

有梦的博客 515

HDOJ-1072 Nightmare

算是自己独立思考写出来的第一个搜索模块的代码了。 #include &lt;iostream&gt; #include &lt;cstdio&gt; #include &lt;cstring&gt; #include &lt;cmath&gt; #include&lt;queue&gt; using namespace std; int n,m,sx,sy,ex,ey,c; int map[...

qq_42863300的博客 156

hdoj 1072 Nightmare

Nightmare Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7918    Accepted Submission(s): 3796 Problem Description Ignatius had a nig

世界很大 483

hdoj 1072 Nightmare 宽度优先遍历

题目大意:在迷宫中有一个炸弹,过六个单位时间就会爆炸,要你求一个起点到迷宫的终点的最短距离,迷宫中有时间重置器,当你走到这个格子,炸弹的爆炸时间重新置为0,迷宫中标识为墙壁的格子不能走,到达任意一个格子时,炸弹计数器为0时,则失败 解题思路:最短距离,就想到用宽度优先遍历,但是要一个辅助的数组来保存每个格子的时间信息。 之前受hdoj 1242的影响,认为格子保存的是当前走过路程的最小值,w了

涛涛不解 1654

【HDOJ】1072 Nightmare

bfs,使用ttl进行剪枝。 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 using namespace std; 6 7 #define MAXNUM 10 8 9 int map[...

weixin_34112181的博客 86
上一篇: HDOJ 1022 Train Problem I
下一篇: HDOJ 1022 Train Problem I
喵不理
博客等级 码龄12年 1粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值