HDU_1072_Nightmare
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1072
题目描述:矩阵表示迷宫,0表示墙,1表示路,2表示起点,3表示终点,4表示重置炸弹时间(6秒),你需要从起点出发(炸弹初始为6秒),在炸弹爆炸前到达终点,问最少需要多少时间。
分析:dfs,可以走走过的路,所以不能使用vis数组来标记,而是用dis和tim两个数组来帮助判断所走路线,通过这两个数组的记录来剪枝(此处剪枝:当sum大于dis[x][y]且time<=tim[x][y]说明当前这条路并非最佳路线,此处着重理解)。
总结:dfs摸到的些许门道,还需加强,剪枝还需要多见识一些。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define INF 100
int map[][];
int dir[][]= {{-,},{,},{,},{,-}};
int dis[][];
int tim[][];
int n,m,minx; bool inside(int x,int y)
{
if(x<n&&x>=&&y<m&&y>=)
return ;
return ;
} void dfs(int x,int y,int time,int sum)
{
if(map[x][y]==&&time>)
{
if(sum<minx)
minx=sum;
return;
}
if(time<=)
return;
if(map[x][y]==)
return;
if(!inside(x,y))
return;
if(time<=tim[x][y]&&sum>=dis[x][y]) //剪枝
return;
if(map[x][y]==)
time=;
dis[x][y]=sum;
tim[x][y]=time;
for(int i=; i<; i++)
{
int mx=x+dir[i][];
int my=y+dir[i][]; dfs(mx,my,time-1,sum+1);
}
} int main()
{
int t,sx,sy,ex,ey;
scanf("%d",&t);
while(t--)
{
memset(tim,,sizeof(tim));
minx=INF;
scanf("%d%d",&n,&m);
for(int i=; i<n; i++)
for(int j=; j<m; j++)
dis[i][j]=INF;
for(int i=; i<n; i++)
for(int j=; j<m; j++)
{
scanf("%d",&map[i][j]);
if(map[i][j]==)
{
sx=i;
sy=j;
}
}
dfs(sx,sy,,);
if(minx!=INF)
printf("%d\n",minx);
else
printf("-1\n");
}
return ;
}
HDU_1072_Nightmare的更多相关文章
- hdu_1072_Nightmare(BFS)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1072 题意:给你一个地图,让你在炸弹爆之前找到出口,最初炸弹设定为6,每走一格需要1,中途有地方能让炸 ...
随机推荐
- EXCEL单元格的获取——多例模式
因为Excel的单元格的行列与单元格是一一相应的,行与列组成的是一对联合主键.给定一个单元格行列或者给定一个单元格名称.须要找到相应的单元格:这样就形成了一种映射关系.须要使用单例模式的变式--多例模 ...
- 1.1 Spring概述
Spring是分层的Java SE/EE应用一站式的轻量开源框架,以 反转控制(Inverse of Control,IoC).面向切面编程(Aspect Oriented Programmi ...
- android application类简单介绍(一)
每次应用程序执行时.应用程序的application类保持实例化的状态. 通过扩展applicaiton类,能够完毕下面3项工作: 1.对android执行时广播的应用程序级事件如低低内做出响应. 2 ...
- Linux系统编程_6_进程环境(C程序典型的存储空间)
1.八种结束Linux进程的方法: 五种正常终止方式: main函数返回: 调用exit: 调用_exit或_Exit 最后一个线程从其启动例程返回 最后一个线程调用pthread_exit 三种异常 ...
- 2015ACM/ICPC Asia Regional Changchun Online /HDU 5438 图
Ponds Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 1310 ...
- 容器ArrayList原理(学习)
一.概述 动态数组,容量能动态增长,元素可以为null,用数组存储,非线程同步(vector线程同步) 每个 ArrayList 实例都有一个容量,该容量是指用来存储列表元素的数组的大小,自动增长(默 ...
- css3 3d特效汇总
本篇全是实战,没有基础,如果不明白3d特效的原理,可能会看不懂,不过没关系,给你推荐一下 张鑫旭css3 3d转换,或者看我的另一篇博客 css3 2d转换3d转换以及动画的知识点汇总,看完这些3d ...
- POJ1704 Georgia and Bob Nim游戏
POJ1704 这道题可以转化为经典的Nim游戏来解决. Nim游戏是这样的 有n堆石子,每堆各有ai个. 两个人轮流在任意石子堆中取至少1个石子,不能再取的输. 解决方法如下, 对N堆石子求异或 为 ...
- 洛谷P1514 引水入城——dfs
题目:https://www.luogu.org/problemnew/show/P1514 搜索+DP: 自己想出来的方法第一次80分好高兴! 再改了改就A了,狂喜乱舞: 也就是 dfs,仔细一想第 ...
- Java Graphics2D类的绘图方法
Graphics2D继承自Graphics,它扩展了Graphics的绘图功能,拥有更强大的二维图形处理能力,提供对几何形状.坐标转换.颜色管理以及文字布局等更精确的控制. Graphics2D定义了 ...