题意:

在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 广搜(逃离爆炸迷宫)的更多相关文章

  1. hdu 1072 广搜

    路径是可以重复走的,但是如果再一次走过时间重置点是没有意义的 #include <iostream> #include <cstdio> #include <cstrin ...

  2. hdu 1175(广搜)

    题意:容易理解... 思路:我开始的思路不好实现,而且有漏洞,时间复杂度也高,后来在网上学了下别人的方法,真心感觉很牛B,不仅代码好实现,而且时间复杂度比较低,具体看代码实现吧!! 代码实现: #in ...

  3. hdu 1180(广搜好题)

    诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Subm ...

  4. HDU 1072 Nightmare (广搜)

    题目链接 Problem Description Ignatius had a nightmare last night. He found himself in a labyrinth with a ...

  5. hdu 1253:胜利大逃亡(基础广搜BFS)

    胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  6. poj 3984:迷宫问题(广搜,入门题)

    迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7635   Accepted: 4474 Description ...

  7. hdu 1195:Open the Lock(暴力BFS广搜)

    Open the Lock Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  8. HDU 1253 (简单三维广搜) 胜利大逃亡

    奇葩!这么简单的广搜居然爆内存了,而且一直爆,一直爆,Orz 而且我也优化过了的啊,尼玛还是一直爆! 先把代码贴上睡觉去了,明天再来弄 //#define LOCAL #include <ios ...

  9. hdu 5025 Saving Tang Monk 状态压缩dp+广搜

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092939.html 题目链接:hdu 5025 Saving Tang Monk 状态压缩 ...

随机推荐

  1. codevs 2800 送外卖 floyd + Tsp

    简单的状压动归 #include<cstdio> #include<algorithm> using namespace std; const int N=17; const ...

  2. 【udacity】机器学习-决策树

    Evernote Export 1.监督学习 我们向系统中输出样本,并且告诉系统样本标签(target),系统用我们给出的不同样本的成功与失败的信息,构建它对成功或失败的因素的理解. 2.分类与回归之 ...

  3. 关于高校表白APP的用户模板和用户场景

      用户模板一: 用户名 小明 性别,年龄 男,20岁 用户状况 单身,在校大学生 生活爱好 喜欢打篮球,唱歌 典型场景 希望找到一个心仪的可以走到最后的姑娘 典型描述 交友 用户比例 ? 用户场景一 ...

  4. Java生成随机数的三种方式

    package cn.zytao.taosir.random; import java.util.Random; public class RandomDemo { private static In ...

  5. 干货:鲜为人用的MySQL高级特性与玩法!

    上一篇文章<万字总结:学习MySQL优化原理,这一篇就够了!>文末给大家留有两个开放的问题: 有非常多的程序员在分享时都会抛出这样一个观点:尽可能不要使用存储过程,存储过程非常不容易维护, ...

  6. B - Networking

    B - Networking 思路:并查集板子. #include<cstdio> #include<cstring> #include<iostream> #in ...

  7. HDU 4345

    细心点想,就明白了,题目是求和为N的各数的最小公倍数的种数.其实就是求N以内的各素数的不同的组合(包含他们的次方),当然,是不能超过N的.用Dp能解决.和背包差不多. #include <ios ...

  8. HDU 4341

    分组背包而已.注意的是,每个时间T,要把一组的全加进去比较一次. #include <iostream> #include <cstdio> #include <cstr ...

  9. 怎样使windows上的javaWEB项目公布到Centos上

    首先在windows上把项目导入到myeclipse或者eclipse(JEE)版本号上. 然后经过调试,没有错误后. 点击项目,然后右键导出(Export...) 然后选择JEE的war格式,这个是 ...

  10. 沃通SSL精灵,让站点HTTPS永只是期

    告别HTTP明文"裸奔"时代 百度.阿里巴巴.必应等越来越多的互联网巨头相继启用全站HTTPS加密,保护用户数据和隐私安全.逐步告别HTTP明文"裸奔"时代. ...