从迷宫中逃脱

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 15120    Accepted Submission(s): 3650
Problem Description
  给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置。gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria能够穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,仅仅能走到与它相邻的4个位置中,当然在行走过程中。gloria不能走到迷宫外面去。令人头痛的是,gloria是个没什么方向感的人,因此。她在行走过程中,不能转太多弯了,否则她会晕倒的。

我们假定给定的两个位置都是空地,初始时。gloria所面向的方向未定,她能够选择4个方向的不论什么一个出发,而不算成一次转弯。

gloria能从一个位置走到另外一个位置吗?

 
Input
  第1行为一个整数t (1 ≤ t ≤ 100),表示測试数据的个数,接下来为t组測试数据,每组測试数据中,

  第1行为两个整数m, n (1 ≤ m, n ≤ 100),分别表示迷宫的行数和列数,接下来m行,每行包含n个字符。当中字符'.'表示该位置为空地,字符'*'表示该位置为障碍,输入数据中仅仅有这两种字符,每组測试数据的最后一行为5个整数k, x1, y1, x2, y2 (1 ≤ k ≤ 10, 1 ≤ x1, x2 ≤ n, 1 ≤ y1, y2
≤ m),当中k表示gloria最多能转的弯数,(x1, y1), (x2, y2)表示两个位置,当中x1,x2相应列。y1, y2相应行。
 
Output
  每组測试数据相应为一行,若gloria能从一个位置走到另外一个位置,输出“yes”。否则输出“no”。
 
Sample Input
  1. 2
  2. 5 5
  3. ...**
  4. *.**.
  5. .....
  6. .....
  7. *....
  8. 1 1 1 1 3
  9. 5 5
  10. ...**
  11. *.**.
  12. .....
  13. .....
  14. *....
  15. 2 1 1 1 3
 
Sample Output
  1. no
  2. yes

题意:求是否能在给定转弯次数内到达终点。

题解:沿着一个方向走究竟。用一个数组记录转弯次数。第45行加了个剪枝。由于用的是广搜,所以第一次到达时肯定是用转弯次数最少的时候,若此时转弯次数都超了那就不用继续搜索下去了。

时间从62ms降低到15ms。

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <queue>
  4. #define maxn 102
  5. using std::queue;
  6.  
  7. char map[maxn][maxn];
  8. int steps, m, n, step[maxn][maxn];
  9. int mov[][2] = {1, 0, -1, 0, 0, 1, 0, -1};
  10. struct Node{
  11. int x, y;
  12. Node operator+(int i){
  13. Node t;
  14. t.x = x + mov[i][0];
  15. t.y = y + mov[i][1];
  16. return t;
  17. }
  18. };
  19.  
  20. bool check(int x, int y)
  21. {
  22. return x < m && x >= 0 && y < n && y >= 0
  23. && map[x][y] != '*';
  24. }
  25.  
  26. bool BFS(int x, int y)
  27. {
  28. if(map[x][y] == 'T') return true;
  29. memset(step, -1, sizeof(step));
  30. Node now, t;
  31. int i;
  32. now.x = x; now.y = y;
  33. queue<Node> Q;
  34. Q.push(now);
  35. while(!Q.empty()){
  36. now = Q.front(); Q.pop();
  37. for(i = 0; i < 4; ++i){
  38. t = now + i;
  39. while(check(t.x, t.y)){
  40. //保证不反复入队。可能出现路线交叉的情况
  41. if(step[t.x][t.y] == -1){
  42. step[t.x][t.y] = step[now.x][now.y] + 1;
  43. if(map[t.x][t.y] == 'T'){
  44. if(step[t.x][t.y] <= steps) return 1;
  45. return 0;
  46. }
  47. Q.push(t);
  48. }
  49. t = t + i;
  50. }
  51. }
  52. }
  53. return false;
  54. }
  55.  
  56. int main()
  57. {
  58. int t, x1, y1, x2, y2, i;
  59. scanf("%d", &t);
  60. while(t--){
  61. scanf("%d%d", &m, &n);
  62. for(i = 0; i < m; ++i)
  63. scanf("%s", map[i]);
  64. scanf("%d%d%d%d%d", &steps, &y1, &x1, &y2, &x2);
  65. --x1; --y1; --x2; --y2;
  66. map[x2][y2] = 'T';
  67. if(BFS(x1, y1)) puts("yes");
  68. else puts("no");
  69. }
  70. return 0;
  71. }

版权声明:本文博客原创文章,博客,未经同意,不得转载。

HDU1728 从迷宫中逃脱 【方向BFS】的更多相关文章

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

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

  2. hdu1728 逃离迷宫---转弯次数不超过k+BFS

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1728 题目大意: 给你一幅图,给出起点终点和最大转弯次数,判断是否能从起点到终点.'*'表示障碍物. ...

  3. 逃离迷宫(HDU 1728 BFS)

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

  4. hdu1728 逃离迷宫

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

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

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

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

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

  7. 逃离迷宫 HDU - 1728(bfs)

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

  8. 别忽视UIImage中的方向属性, imageOrientation-转

    转 : 别忽视UIImage中的方向属性, imageOrientation

  9. hdu1728 逃离迷宫bfs

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

随机推荐

  1. WM_CAP_DRIVER_CONNECT

    WM_CAP_DRIVER_CONNECT //ActiveX ---->OnCreate m_pit.Create(IDD_CAM_DIALOG,this);  CRect rc;  this ...

  2. 将OpenCV捕获的摄像头加载到picture控件中

    CRect rect; CStatic* pStc; CDC* pDC; HDC hDC; pStc = (CStatic*)GetDlgItem(IDC_CAM);//IDC_CAM是Picture ...

  3. 【5001】n皇后问题

    Time Limit: 10 second Memory Limit: 2 MB 在n*n的棋盘上放置n个皇后(国际象棋中的皇后,n≤10)而彼此不受攻击(即在棋盘的任一行,任一列和任一对角线上不能放 ...

  4. 每天一个JavaScript实例-操作元素定位元素

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  5. error C2220: warning treated as error - no 'object' file generated warning C4819: The file contains a character that cannot be represented in the current code page (936).

    用Visual Studio2015 编译时,遇到如下编译错误: error C2220: warning treated as error - no 'object' file generated ...

  6. 苹果浏览器Safari对html标签submit按钮的默认渲染

    -webkit-appearance: none; 上面的设置就告诉Safari不要使用默认渲染,使用我们写好的 有这么一个webkit的私有属性: -webkit-appearance:none;  ...

  7. ccpc2016长春站打铁记(后记)

    Day3 "学术交流日" 自己进我的空间看吧. http://user.qzone.qq.com/190741511/4

  8. c# 调用ArcEngine的GP工具

    转自原文c# 调用ArcEngine的GP工具,AE调用GP工具 IAoInitialize m_AoInitialize = new AoInitializeClass(); esriLicense ...

  9. HDU 1243 反恐训练营 (动态规划求最长公共子序列)

    反恐训练营 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  10. php实现 坐标移动

    php实现  坐标移动 一.总结 一句话总结:伪代码,带函数逻辑,函数这样的方式写算法程序会节约超多的时间. 1.为什么算法题数据输入最好用多组数据输入的方式? 因为都是多组数据测试,而且多组数据输入 ...