http://acm.hdu.edu.cn/showproblem.php?pid=1026

模拟一个人走迷宫,起点在(0,0)位置,遇到怪兽要和他决斗,决斗时间为那个格子的数字,就是走一个格子花费时间1,

遇到有数字的格子还要花费这个数字大小的时间,输出最后走到(n-1,m-1)的最小时间,还要输出他的路径,'X'是墙,‘.’是可以走的空地

就是这个路径,刚一看题看到那个样例输出吓得我都飞起来了,好多啊!

其实还好啦,广搜,一开始还因为是普通的广搜,后来发现不一样,

为了寻求最小时间,他可以选择走有数字的格子也可以选择绕过去,看哪个时间短一些

首先求出最小时间,跟那个连连看差不多,用visit数组初始化很大,来储存到达每个点的最小时间

然后输出路径的时候用递归回溯,因为广搜是广泛的搜索,并不能保证走过的点都是最短路径上的点

所以从终点开始利用他的方向来往前回溯,注意因为没有用优先队列和输出漏了句号所以刚开始wa了几发

code

 #include<cstdio>
#include<climits>
#include<queue>
#include<cstring>
using namespace std;
char map[][];
int visit[][];
int flag[][];
struct point{
int x,y;
int time;
friend bool operator<(point n1,point n2)
{
return n2.time<n1.time;
}
};
int n,m,t;
int dx[]={,,,-};
int dy[]={,-,,};
int bfs()
{
int i;
priority_queue<point>Q;
point now,next;
now.x=;now.y=;
now.time=;
visit[][]=;
Q.push(now);
while (!Q.empty())
{
now=Q.top();
Q.pop();
if (now.x==n-&&now.y==m-)
return visit[now.x][now.y];
for (i=;i<;i++)
{
next.x=now.x+dx[i];
next.y=now.y+dy[i];
if (next.x<||next.x>=n||next.y<||next.y>=m)continue;
if (map[next.x][next.y]=='X')continue;
if (map[next.x][next.y]=='.')
next.time=now.time+;
else
next.time=now.time++(map[next.x][next.y]-'');
if (map[next.x][next.y]<=''&&map[next.x][next.y]>=''&&visit[next.x][next.y]>now.time+(map[next.x][next.y]-''))
{
visit[next.x][next.y]=now.time++(map[next.x][next.y]-'');
flag[next.x][next.y]=i+;
Q.push(next);
}
else if (map[next.x][next.y]=='.'&&visit[next.x][next.y]>now.time+)
{
visit[next.x][next.y]=now.time+;
flag[next.x][next.y]=i+;
Q.push(next);
}
}
}
return -;
}
void output(int x,int y)//回溯
{
int sx,sy;
if (flag[x][y]==) return ;
sx=x-dx[flag[x][y]-];
sy=y-dy[flag[x][y]-];
output(sx,sy);
printf("%ds:(%d,%d)->(%d,%d)\n",t++,sx,sy,x,y);
if (map[x][y]<=''&&map[x][y]>='')
{
int w=map[x][y]-'';
while (w--)
printf("%ds:FIGHT AT (%d,%d)\n",t++,x,y);
}
}
int main()
{
int i,j,q;
while (~scanf("%d %d",&n,&m))
{
getchar();
for (i=;i<n;i++)
{
for (j=;j<m;j++)
scanf(" %c",&map[i][j]);
}
for (i=;i<n;i++)
for (j=;j<m;j++)
{
visit[i][j]=INT_MAX;
flag[i][j]=;
}
q=bfs();
if (q==-)
{
puts("God please help our poor hero.");
puts("FINISH");
}
else
{
printf("It takes %d seconds to reach the target position, let me show you the way.\n",q);
t=;
output(n-,m-);
puts("FINISH");
}
}
return ;
}

hdu 1026(BFS+输出路径) 我要和怪兽决斗的更多相关文章

  1. hdu 1026 bfs+记录路径

    题意:从0,0点出发到n-1,m-1点,路上的数字代表要在这个点额外待多少秒,求最短的路 递归输出路径即可 #include<cstdio> #include<iostream> ...

  2. hdu 1385 Floyd 输出路径

    Floyd 输出路径 Sample Input50 3 22 -1 43 0 5 -1 -122 5 0 9 20-1 -1 9 0 44 -1 20 4 05 17 8 3 1 //收费1 3 // ...

  3. HDU 1026 (BFS搜索+优先队列+记录方案)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1026 题目大意:最短时间内出迷宫.迷宫里要杀怪,每个怪有一定HP,也就是说要耗一定时.输出方案. 解 ...

  4. hdu 1503 LCS输出路径【dp】

    hdu 1503 不知道最后怎么输出,因为公共部分只输出一次.有人说回溯输出,感觉好巧妙!其实就是下图,输出的就是那条灰色的路径,但是初始时边界一定要初始化一下,因为最第一列只能向上走,第一行只能向左 ...

  5. 蓝桥T291(BFS + 输出路径)

    http://lx.lanqiao.org/problem.page?gpid=T291 学霸的迷宫   时间限制:1.0s   内存限制:256.0MB      问题描述 学霸抢走了大家的作业,班 ...

  6. poj 3414 Pots(bfs+输出路径)

    Description You are given two pots, having the volume of A and B liters respectively. The following ...

  7. bfs输出路径 && 最短路(迪杰斯特拉)输出路径

    问题描述 解决方法 1.像第一个问题那就是最短路问题(我代码采用迪杰斯特拉算法)实现 2.换乘次数最少,那就用bfs广搜来寻找答案.但是我的代码不能保证这个最少换乘是最短路程 代码 1 #includ ...

  8. 地下迷宫(bfs输出路径)

    题解:开一个pre数组用编号代替当前位置,编号用结构题另存,其实也可以i*m+j来代替,我写的有点麻烦了; 代码: #include <iostream> #include <cst ...

  9. HDU 1026 Ignatius and the Princess I(带路径的BFS)

    http://acm.hdu.edu.cn/showproblem.php?pid=1026 题意:给出一个迷宫,求出到终点的最短时间路径. 这道题目在迷宫上有怪物,不同HP的怪物会损耗不同的时间,这 ...

随机推荐

  1. UILabel的一些属性

    1.0  lineBreakMode 1.1.0 NSLineBreakByWordWrapping = 0,  以字符为显示单位显示,后面部分省略不显示 NSLineBreakByCharWrapp ...

  2. 吴裕雄 15-MySQL LIKE 子句

    我们知道在 MySQL 中使用 SQL SELECT 命令来读取数据, 同时我们可以在 SELECT 语句中使用 WHERE 子句来获取指定的记录.WHERE 子句中可以使用等号 = 来设定获取数据的 ...

  3. Java 中 == 和 equals 的区别

    有一段时间,== 和 equals 的区别一直困扰着我.因为涉及到Java的内存机制,然而Java的内存机制又是比较抽象的东西,所以对那时候的我来说,实在是很难理解. == 和 equals 最大的区 ...

  4. macbook pro。已经连接上wifi,但是,不能上网的问题

    有天,macbook pro关机后,再打开就上不了网了,后面网上看了,说是安装了 lantern出问题,我一想,有次关机lantern是被我强制关掉的.所以再次打开lantern就可以 上网了,然后正 ...

  5. spket插件安装并设置JQuery自动提示(转)

    spket是一个开发JavaScript.jQuery.Ext_js等的开发工具,它可以 是独立的IDE,也可以作为Eclipse的插件使用,下面介绍如何在Eclipse中安装spket插件: 1.首 ...

  6. Vue之数据监听存在的问题

    Vue之数据监听 当数据监听的是列表时,数据发生改变,不会被监听到. // 用$set修改数组中的数组能够被监听 // app.$set(this.hobby, 0, "爱你哦") ...

  7. mute

    mute - 必应词典 英[mjuːt] n.哑吧:沉默的人:[法律]拒绝答辩的被告人:鸟粪 adj.哑的:缄默无言的:(一时)说不出话的:(猎狗)不叫的 v.排泄:减弱…的声音:柔和…的色调 网络静 ...

  8. Linux 有线 校园网

    1.首先在ifconfig命令在终端查看自己的ip地址,然后记录下来 2.然后用sudo -i 命令转换到root权限下 3.在自己家目录下输入pppoeconf 4.遇到username时,讲自己的 ...

  9. 脚手架搭建vue框架

    一. node安装 1)如果不确定自己是否安装了node,可以在命令行工具内执行: node -v  (检查一下 版本): 2)如果 执行结果显示: xx 不是内部命令,说明你还没有安装node , ...

  10. webpack(一) 安装使用

    (一)webpack的安装 webpack是基于node.js,因此需要安装node.js. 安装好node.js 后,全局安装webpack,命令如下 npm install webpack -g ...