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

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

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

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

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

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

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

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

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

code

  1. #include<cstdio>
  2. #include<climits>
  3. #include<queue>
  4. #include<cstring>
  5. using namespace std;
  6. char map[][];
  7. int visit[][];
  8. int flag[][];
  9. struct point{
  10. int x,y;
  11. int time;
  12. friend bool operator<(point n1,point n2)
  13. {
  14. return n2.time<n1.time;
  15. }
  16. };
  17. int n,m,t;
  18. int dx[]={,,,-};
  19. int dy[]={,-,,};
  20. int bfs()
  21. {
  22. int i;
  23. priority_queue<point>Q;
  24. point now,next;
  25. now.x=;now.y=;
  26. now.time=;
  27. visit[][]=;
  28. Q.push(now);
  29. while (!Q.empty())
  30. {
  31. now=Q.top();
  32. Q.pop();
  33. if (now.x==n-&&now.y==m-)
  34. return visit[now.x][now.y];
  35. for (i=;i<;i++)
  36. {
  37. next.x=now.x+dx[i];
  38. next.y=now.y+dy[i];
  39. if (next.x<||next.x>=n||next.y<||next.y>=m)continue;
  40. if (map[next.x][next.y]=='X')continue;
  41. if (map[next.x][next.y]=='.')
  42. next.time=now.time+;
  43. else
  44. next.time=now.time++(map[next.x][next.y]-'');
  45. if (map[next.x][next.y]<=''&&map[next.x][next.y]>=''&&visit[next.x][next.y]>now.time+(map[next.x][next.y]-''))
  46. {
  47. visit[next.x][next.y]=now.time++(map[next.x][next.y]-'');
  48. flag[next.x][next.y]=i+;
  49. Q.push(next);
  50. }
  51. else if (map[next.x][next.y]=='.'&&visit[next.x][next.y]>now.time+)
  52. {
  53. visit[next.x][next.y]=now.time+;
  54. flag[next.x][next.y]=i+;
  55. Q.push(next);
  56. }
  57. }
  58. }
  59. return -;
  60. }
  61. void output(int x,int y)//回溯
  62. {
  63. int sx,sy;
  64. if (flag[x][y]==) return ;
  65. sx=x-dx[flag[x][y]-];
  66. sy=y-dy[flag[x][y]-];
  67. output(sx,sy);
  68. printf("%ds:(%d,%d)->(%d,%d)\n",t++,sx,sy,x,y);
  69. if (map[x][y]<=''&&map[x][y]>='')
  70. {
  71. int w=map[x][y]-'';
  72. while (w--)
  73. printf("%ds:FIGHT AT (%d,%d)\n",t++,x,y);
  74. }
  75. }
  76. int main()
  77. {
  78. int i,j,q;
  79. while (~scanf("%d %d",&n,&m))
  80. {
  81. getchar();
  82. for (i=;i<n;i++)
  83. {
  84. for (j=;j<m;j++)
  85. scanf(" %c",&map[i][j]);
  86. }
  87. for (i=;i<n;i++)
  88. for (j=;j<m;j++)
  89. {
  90. visit[i][j]=INT_MAX;
  91. flag[i][j]=;
  92. }
  93. q=bfs();
  94. if (q==-)
  95. {
  96. puts("God please help our poor hero.");
  97. puts("FINISH");
  98. }
  99. else
  100. {
  101. printf("It takes %d seconds to reach the target position, let me show you the way.\n",q);
  102. t=;
  103. output(n-,m-);
  104. puts("FINISH");
  105. }
  106. }
  107. return ;
  108. }

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. idea git 从github上拉取项目 更改上传

    更改上传: 新增文件上传时注意:

  2. tensorflow serving 之minist_saved_model.py解读

    最近在学习tensorflow serving,但是就这样平淡看代码可能觉得不能真正思考,就想着写个文章看看,自己写给自己的,就像自己对着镜子演讲一样,写个文章也像自己给自己讲课,这样思考的比较深,学 ...

  3. SQL左外连接

    第一篇写在网络上的笔记 左外连接 select a.*,b.* from a left join b on a与b的连接条件; 先展示left join关键字左边的a表中的所有数据,根据条件关联查询l ...

  4. 微信小程序之富文本解析

    亲身体验 wxparse 是个坑,弃之不用 微信小程序的 <rich-text>标签挺好用的 用法如下: 1.wxml页面 <rich-text nodes="{{node ...

  5. polyfill

    [polyfill] 在JavaScript的世界里,有两个词经常被提到,shim和polyfill.它们指的都是什么,又有什么区别? 一个shim是一个库,它将一个新的API引入到一个旧的环境中,而 ...

  6. 循环流程控制&方法(3)

    1.循环流程控制 当某一段代码需要重复执行多次的时候,就需要用到循环: 循环三要素: 循环的起点:循环的终点(结束条件):步长: 当循环条件不再成立,结束循环: for循环 for(循环起点:循环条件 ...

  7. Cacti ERROR: opening '*.rrd': No such file or directory 解决方法

    error: opening /home/cacti/rra/url-2 no such file or directory 在看Cacti Graph Debug Mode发现如下报错 RRDToo ...

  8. 一分钟了解Android横竖屏 mdpi hdpi xhdpi xxhdpi xxxhdpi (转)

    转自:http://blog.csdn.net/a704755096/article/details/46342689 DPI:每英寸像素数 简单的屏幕分辨率计算方法: DisplayMetrics ...

  9. css设计技巧

    如果设置了样式发现没有效果,可以把需要调的元素或者父元素等设置一下背景,然后看看哪个父元素或子元素有样式控制,可以清除一下.

  10. ActiveMQ之HelloWorld

    JMS实现JMS接口的消息中间件 Provider:生产者 Consumer:消费者 PTP:Point to Point:点对点的消息模型 Pub/Sub:Publish/Subscribe:发布订 ...