hdu 1072 广搜(逃离爆炸迷宫)
题意:
在n×m的地图上,0表示墙,1表示空地,2表示人,3表示目的地,4表示有定时炸弹重启器。定时炸弹的时间是6,人走一步所需要的时间是1。每次可以上、下、左、右移动一格。当人走到4时如果炸弹的时间不是0,可以重新设定炸弹的时间为6。如果人走到3而炸弹的时间不为0时,成功走出。求人从2走到3的最短时间。这个题中每个结点都是可以重复访问的,但其实,炸弹重置点不要重复走,因为,走到炸弹重置点时时间就会被设置为最大时间,当重新返回时时间又设成最大,但此时已走的步数肯定增加了,所以如果存在较优解的话那么肯定在第一次到这点后就可以找到较优解,这也是代码中剪枝的原理,只是将这种思想扩展到普通点而已,所以采用记忆化搜。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue> using namespace std; const int MAX=10; typedef struct point //每个单元信息
{
int x,y; //坐标
int step; //走到这里的步数
int time; //还剩多少时间
}Point; Point cur,nxt; int mmap[MAX][MAX];
int n,m;
int si,sj;
int dx[]={-1,1,0,0}; //方向
int dy[]={0,0,-1,1}; void bfs() //广搜
{
queue<Point> q;
cur.time=6;
cur.step=0;
cur.x=si;
cur.y=sj;
q.push(cur); //把起点压入队列中
while(!q.empty())
{
cur=q.front();
q.pop();
for(int i=0;i<4;i++) //四个方向搜索
{
nxt.x=cur.x+dx[i];
nxt.y=cur.y+dy[i];
nxt.time=cur.time-1; //时间-1
nxt.step=cur.step+1; //步数+1
if(nxt.x<0||nxt.x>=n||nxt.y<0||nxt.y>=m) continue; //如果当前点的坐标超出迷宫范围 直接下一个方向搜索
if(mmap[nxt.x][nxt.y]==1)
{
if(nxt.time>0)
{
q.push(nxt);
}
}
else if(mmap[nxt.x][nxt.y]==3)
{
if(nxt.time>0)
{
cout<<nxt.step<<endl;
return;
}
}
else if(mmap[nxt.x][nxt.y]==4)
{
if(nxt.time>0)
{
nxt.time=6;
mmap[nxt.x][nxt.y]=0; //遇到能重置时间的点,要把它置成墙,因为如果不这样会造成死循环。并且如果第二次走到这里时间都是一样,但步数会增加。
q.push(nxt); }
}
}
}
cout<<-1<<endl;
} int main()
{
int Case;
cin>>Case;
while(Case--)
{ memset(mmap,0,sizeof(mmap));
cin>>n>>m;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>mmap[i][j];
if(mmap[i][j]==2)
{
si=i,sj=j; //纪录起点坐标。
}
}
}
bfs(); }
return 0;
}
hdu 1072 广搜(逃离爆炸迷宫)的更多相关文章
- hdu 1072 广搜
路径是可以重复走的,但是如果再一次走过时间重置点是没有意义的 #include <iostream> #include <cstdio> #include <cstrin ...
- hdu 1175(广搜)
题意:容易理解... 思路:我开始的思路不好实现,而且有漏洞,时间复杂度也高,后来在网上学了下别人的方法,真心感觉很牛B,不仅代码好实现,而且时间复杂度比较低,具体看代码实现吧!! 代码实现: #in ...
- hdu 1180(广搜好题)
诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Subm ...
- HDU 1072 Nightmare (广搜)
题目链接 Problem Description Ignatius had a nightmare last night. He found himself in a labyrinth with a ...
- hdu 1253:胜利大逃亡(基础广搜BFS)
胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- poj 3984:迷宫问题(广搜,入门题)
迷宫问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7635 Accepted: 4474 Description ...
- hdu 1195:Open the Lock(暴力BFS广搜)
Open the Lock Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- HDU 1253 (简单三维广搜) 胜利大逃亡
奇葩!这么简单的广搜居然爆内存了,而且一直爆,一直爆,Orz 而且我也优化过了的啊,尼玛还是一直爆! 先把代码贴上睡觉去了,明天再来弄 //#define LOCAL #include <ios ...
- hdu 5025 Saving Tang Monk 状态压缩dp+广搜
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092939.html 题目链接:hdu 5025 Saving Tang Monk 状态压缩 ...
随机推荐
- 热重载 预编译 编译器 JS引擎 作用域
热重载就是页面每次改动,不需要手动去刷新,可自动刷新.保持vuex的状态. JS之预编译 JavaScript的预编译 编译器 JS引擎 作用域三者之间的关系 建议你先去看看你不知道的JavaScri ...
- KEEPALIVED+LVS+MYCAT实现MYSQL高可用环境搭建
一.安装keepalived和ipvsadm 注意:ipvsadm并不是lvs,它只是lvs的配置工具. 为了方便起见,在这里我们使用yum的安装方式 分别在10.18.1.140和10.18.1.1 ...
- css3 3d 魔方
<style><!--@charset "UTF-8"; * { margin: 0; padding: 0 } html,body{ width: 100%; ...
- String,StringBuffer,StringBuild的区别
1.三者在执行速度方面的比较:StringBuilder > StringBuffer > String 2.String <(StringBuffer,StringBuild ...
- 1.2 为Eclipse绑定Tomcat
1.window→preferences打开属性窗口 2.点击add 3.点击Tomcat6.0 点击next 4.选择tomcat的解压目录和jdk,并点击finish 5.点击ok 6.打开ser ...
- 2015 Multi-University Training Contest 8 hdu 5385 The path
The path Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on HDU. Original ID: 5 ...
- Oracle 高水位(HWM: High Water Mark)
http://blog.itpub.net/31397003/viewspace-2137246/ http://blog.itpub.net/12778571/viewspace-582695/ h ...
- 编程算法 - 求1+2+...+n(模板类) 代码(C++)
求1+2+...+n(模板类) 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 求1+2+...+n, 要求不能使用乘除法\for\whil ...
- poj1035Spell checker
暴力解决. 先把字典里的每一个单词的长度存起来.在查找的时候.就比較长度,在多一个少一个之间找, #include<stdio.h> #include<string.h> #i ...
- openwrt针对RT5350代码下载,配置和编译
转载地址:http://blog.csdn.net/dean_gdp/article/details/37091685 近期买了块官方板的RT5350: 先介绍代码下载.下面命令都是用登录用户运行,无 ...