HDU-1072-Nightmares
这题可以用dfs写,我们记忆化搜索。
我们定义一个step和time数组,分别表示走到这点的最小步数,time表示走到该点炸弹还剩多少时间。
递归边界一是,如果走到该点,时间等于0,我们就返回。
如果走到了终点并且我们这次走到这点的最小步数小于了之前的答案,我们就更新答案并返回。
剪枝,首先越界剪枝,然后我们走到一点,不能步数增加了,并且上一次我们走这点炸弹的剩余时间pre,小于这次的炸弹剩余时间now。
那样的话,我们不如不走,我们还可以知道我们如果走到这点,步数和上一次相同,剩余时间也相同,我们就不必再搜这点,所以有两个等于。
然后我们更新步数和时间,更新之后再来判断,此时我们走到下一个房间,是否能够重置时间,可以就重置。
然后搜向下一个节点。
#include <cstdio>
#include <cstring>
const int INF=0x3f3f3f3f;
int map[10][10],step[10][10],time[10][10];
int d[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int n,m,ans; void dfs(int x,int y)
{
if (time[x][y]<=0)
return;
if (map[x][y]==3) {
if (step[x][y]<ans)
ans=step[x][y];
return ;
}
for (int i=0;i<4;i++) {
int dx=x+d[i][0];
int dy=y+d[i][1];
if (dx>=0&&dy>=0&&dx<n&&dy<m&&map[dx][dy]) {
if (step[x][y]+1>=step[dx][dy]&&time[x][y]-1<=time[dx][dy])
continue;
step[dx][dy]=step[x][y]+1;
time[dx][dy]=time[x][y]-1;
if (map[dx][dy]==4&&time[dx][dy]>0)
time[dx][dy]=6;
dfs(dx,dy);
}
}
} int main()
{
int t,sx,sy;
scanf("%d",&t);
while (t--) {
scanf("%d%d",&n,&m);
for (int i=0;i<n;i++) {
for (int j=0;j<m;j++) {
scanf("%d",&map[i][j]);
if (map[i][j]==2)
sx=i,sy=j;
}
}
memset(time,0,sizeof(time));
memset(step,INF,sizeof(step));
ans=INF;
time[sx][sy]=6;
step[sx][sy]=0;
dfs(sx,sy);
printf("%d\n",ans==INF?-1:ans);
}
return 0;
}
HDU-1072-Nightmares的更多相关文章
- HDU 1072(记忆化BFS)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1072 题目大意:走迷宫.走到装置点重置时间,到达任一点时的时间不能为0,可以走重复路,求出迷宫最短时 ...
- hdu 1072 Nightmare (bfs+优先队列)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1072 Description Ignatius had a nightmare last night. H ...
- hdu 1072(BFS) 有炸弹
http://acm.hdu.edu.cn/showproblem.php?pid=1072 题目大意是在一个n×m的地图上,0表示墙,1表示空地,2表示人,3表示目的地,4表示有定时炸弹重启器. 定 ...
- hdu - 1072(dfs剪枝或bfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1072 思路:深搜每一个节点,并且进行剪枝,记录每一步上一次的s1,s2:如果之前走过的时间小于这一次, ...
- hdu - 1072 Nightmare(bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1072 遇到Bomb-Reset-Equipment的时候除了时间恢复之外,必须把这个点做标记不能再走,不然可能造 ...
- HDU 1072 Nightmare
Description Ignatius had a nightmare last night. He found himself in a labyrinth with a time bomb on ...
- HDU 1072 (不一样的入队条件) Nightmare
之前的BFS都是需要一个标记数组,但这个题不一样,因为可能一个格子不止走一次. 那么我们就要寻找新的入队条件:left比上次经过的时候大才入队(left表示上次经过该点时剩余的时间). 为什么呢?我们 ...
- hdu 1072 广搜
路径是可以重复走的,但是如果再一次走过时间重置点是没有意义的 #include <iostream> #include <cstdio> #include <cstrin ...
- HDU 1072/BFS
题目链接 Nightmare Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- hdu 1072 有炸弹的迷宫 (DFS)
题意:在n×m的地图上,0表示墙,1表示空地,2表示人,3表示目的地,4表示有定时炸弹重启器.定时炸弹的时间是6,人走一步所需要的时间是1.每次可以上.下.左.右移动一格.当人走到4时如果炸弹的时间不 ...
随机推荐
- mysql-5.5.56免安装版配置方法
1. 下载mysql-5.5.56-winx64 网址:dev.mysql.com/downloads/mysql/ 2. 解压MySQL压缩包 将以下载的MySQL压缩包解压到自定义目录下,我 ...
- jQuery EasyUI/TopJUI创建日期输入框
jQuery EasyUI/TopJUI创建日期输入框 日期时间输入框组件 HTML required:必填字段,默认为false:prompt:显示在输入框的提示性文字:pattern:日期格式 Y ...
- Linux上安装Docker,并成功部署NET Core 2.0
概述 容器,顾名思义是用来存放并容纳东西的器皿: 而容器技术伴着Docker的兴起也渐渐的映入大家的眼帘,它是一个抽象的概念,同时也是默默存在世上多年的技术,不仅能使应用程序间完全的隔离,而且还能在共 ...
- SpringBoot---核心---基本配置
1.[入口类和@SpringBootApplication注解] 2.[关闭特定的配置] 3.[定制Banner] 1.1 修改Banner 1.2 关闭Banner 4.SpringBoot配置文件
- React Router 4.0中文快速入门
import React from 'react' import { BrowserRouter as Router, Route, Link } from 'react-router-dom' co ...
- Java基础语法(练习)
Java基础语法 今日内容介绍 u 循环练习 u 数组方法练习 第1章 循环练习 1.1 编写程序求 1+3+5+7+……+99 的和值. 题目分析: 通过观察发现,本题目要实现的奇数(范围1-100 ...
- BigDecimal的加减乘除
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更小的数进行 ...
- azure powershell 获取可用镜像列表
通过Azure Powershell 指定location和Pbulishername 获取所有可用镜像的 publisherName,Offer,Skus,Version,location信息列表 ...
- Linux 系统挂载阿里云数据盘
适用系统:Linux(Redhat , CentOS,Debian,Ubuntu) * Linux的云服务器数据盘未做分区和格式化,可以根据以下步骤进行分区以及格式化操作. 下面的操作将会把数据盘划 ...
- SCCM Collection 集合获取计算机最后启动时间
获取计算机客户端最后一次启动时间,我们可以通过多种来源获取,如活动目录组 ,而不仅仅是SCCM 收集,希望对您有所帮助,下面分享PowerShell 脚本 # 1 $CollectionName = ...