题目链接:

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

题目大意:

给你一幅图,给出起点终点和最大转弯次数,判断是否能从起点到终点。‘*‘表示障碍物。

思路:

刚看到题目的时候有人会立刻想到对四个方向一步一步进行 BFS, 其实这样是不行的 , 因为当从两条路径 BFS 到同一点的时候 , 要选择其中一个继续 BFS, 如果转弯数都相同的话 , 就很难判断哪条路径有可能通向终点 . 所以 , 这种方法行不通 .

而这题的解法就是对四个方向 BFS, 但不是一步一步 , 也就是搜一个方向的时候一直搜索到沿这个方向能走到的尽头 , 这样搜的话 , 能够保证搜过的路径的转弯次数都是最小的 ( 因为这是基于转弯次数从 0 到 k 的 BFS).

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<string>
  6. #include<queue>
  7. using namespace std;
  8. typedef long long ll;
  9. const int INF = <<;
  10. const int maxn = ;
  11. int T, cases;
  12. int n, m, k, x1, y1, x2, y2;
  13. char Map[][];
  14. bool vis[][];
  15. int dir[][] = {,,,,-,,,-};
  16. struct node
  17. {
  18. int x, y, time;
  19. node(){}
  20. node(int x, int y, int time):x(x), y(y), time(time){}
  21. };
  22. bool judge(int x, int y)
  23. {
  24. return (x >= && x < n && y >= && y < m && !vis[x][y] && Map[x][y] == '.');
  25. }
  26. void bfs()
  27. {
  28. queue<node>q;
  29. q.push(node(x1, y1, -));//-1表示起点
  30. while(!q.empty())
  31. {
  32. node a = q.front();
  33. q.pop();
  34. if(a.time > k)break;
  35. if(a.x == x2 && a.y == y2)
  36. {
  37. printf("yes\n");
  38. return;
  39. }
  40. vis[a.x][a.y] = ;
  41. //vis放在这里是因为一个位置可能多次经过,因为从不同方向上,但是拿出队列之后就一定不能再次经过了
  42. for(int i = ; i < ; i++)
  43. {
  44. int xx = a.x + dir[i][];
  45. int yy = a.y + dir[i][];
  46. while(judge(xx, yy))//往一个方向走到底
  47. {
  48. q.push(node(xx, yy, a.time + ));
  49. xx += dir[i][];
  50. yy += dir[i][];
  51. }
  52. }
  53. }
  54. printf("no\n");
  55. return;
  56. }
  57. int main()
  58. {
  59. cin >> T;
  60. while(T--)
  61. {
  62. memset(vis, , sizeof(vis));
  63. cin >> n >> m;
  64. for(int i = ; i < n; i++)cin >> Map[i];
  65. cin >> k >> y1 >> x1 >> y2 >> x2;
  66. x1--, y1--, x2--, y2--;
  67. bfs();
  68. }
  69. }

hdu1728 逃离迷宫---转弯次数不超过k+BFS的更多相关文章

  1. hdu1728逃离迷宫 (利用最短路径思想+优先队列(BFS))

    Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有 ...

  2. DFS(5)——hdu1728逃离迷宫

    一.题目回顾 题目链接:逃离迷宫 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地 ...

  3. Hdu1728 逃离迷宫 2017-01-17 10:56 81人阅读 评论(0) 收藏

    逃离迷宫 Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submissi ...

  4. hdu1728 逃离迷宫

    给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位 ...

  5. hdu1728 逃离迷宫bfs

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1728/ 关于广度优先搜索的第一篇题解.广度优先搜索,就是状态树的层次遍历,一层一层的搜索,直到搜索到目标状态为止 ...

  6. HDU 5056 Boring count(不超过k个字符的子串个数)

    Boring count Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot ...

  7. hdu 1728 迷宫 给定最大转弯次数 (BFS)

    给出起点 终点 以及转弯次数 在<=转弯次数的条件 能否走到终点 Sample Input25 5...** // .可走 *不可走*.**...........*....1 1 1 1 3 / ...

  8. hdu 1728:逃离迷宫(DFS,剪枝)

    逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  9. HDU 1728:逃离迷宫(BFS)

    http://acm.hdu.edu.cn/showproblem.php?pid=1728 逃离迷宫 Problem Description   给定一个m × n (m行, n列)的迷宫,迷宫中有 ...

随机推荐

  1. AngularJs的resource服务与Rest服务交互

    前言以后补: * 在使用resource服务返回的资源对象后具有与后台数据交互的五大接口:save query delete remove get 五种默认行为: { "get": ...

  2. mybatis返回list

    1 Model类 public class Vo { /** * this is used for receive data partly from table user_question_secti ...

  3. UnderScore的使用实例记录

    集合操作 _.range(),主要用于区间的获取操作.参数说明:(param1):范围上限,(param1,param2):起始及结束范围,(param1,param2,param3):起始结束范围, ...

  4. window平台写的shell脚步在Linux不识别

    ---恢复内容开始--- 出现的问题是 写的shell脚步在Linux执行的时候不被识别 解决方案: 1.确保用户对文件有读写及执行权限 oracle@linux-106:~/RMAN/bin> ...

  5. Linux chgrp命令

    在lunix系统里,文件或目录的权限的掌控以拥有者及所诉群组来管理.可以使用chgrp指令取变更文件与目录所属群组,这种方式采用群组名称或群组识别码都可以.Chgrp命令就是change group的 ...

  6. 百度API地图的标注不居中显示,而显示在左上角

    前言:今天弄个百度地图,弄了半天就是不居中,之前使用一直没有遇到这个问题.所以就一直在找原因. 百度地图对地图所在的div做了显示隐藏之类操作,标注就不再居中显示,而显示在左上角. 查了很久,有人提出 ...

  7. JVM学习六:JVM之类加载器之双亲委派机制

    前面我们知道类加载有系统自带的3种加载器,也有自定义的加载器,那么这些加载器之间的关系是什么,已经在加载类的时候,谁去加载呢?这节,我们将进行讲解. 一.双亲委派机制 JVM的ClassLoader采 ...

  8. HttpServletRequest对象方法的用法

    1. 获得客户机信息    getRequestURL方法返回客户端发出请求时的完整URL.    getRequestURI方法返回请求行中的资源名部分.    getQueryString 方法返 ...

  9. linux scp 命令

    scp 命令 scp 命令 意思是 secure copy 即安全拷贝,可以把它看做是 cp 命令的高级版,可以跨主机拷贝. 经常用来在局域网内不同主机之间分享文件,或者在本机与远程主机中分享文件. ...

  10. spring框架学习笔记4:SpringAOP实现原理

    AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.OOP引入 ...