逃离迷宫

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 19656    Accepted Submission(s):
4783

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
2
5 5
...**
*.**.
.....
.....
*....
1 1 1 1 3
5 5
...**
*.**.
.....
.....
*....
2 1 1 1 3
 
Sample Output
no
yes
 
我们举个例子: 要判断从S能否到T。
 
我们用used[][]来记录从S出发第一次到达某个位置时的转弯次数(也可以说成是起点S到该位置至少转弯次数),若为-1说明该点还未遍历。
 
初始化used 为 -1
 
 
上图:
 
 
我们假设遍历方向为左,上,右,下。为了简化问题,我们假设没有障碍物。
 
第一步:遍历完四个方向,对于若used[ x ][ y ]为负1的点,used[ x ][ y ] = 遍历起点次数  + 1 并且入队列(红线上的点除了遍历起点外全部入队 )。
 
 
二:继续上次同样的做法
 
 
重复上面的做法,因为蓝线上的点除了遍历起点之外used值全为-1,我们把它们全部入队且 used值 = 遍历起点的used + 1 = 1,证明从S点出发到这条线上任意一点都会至少转一次弯。
 
 
 
三:同上面
 
遍历完左边首先入队的点后,我们要遍历上方入队的点。图中给出已遍历位置的used值。我们开始遍历上方入队的点,如黄线,它也要遍历四个方向,但是对于已经计算过used值的点,就不能再更新也不能让它们入队,只将那些used值为-1的点更新used值后入队。
 
 
 
四:由S上方的第二个点开始遍历,我们看到会到达T点,这时计算T位置的used值 = 0 + 1 = 1。得到答案。
 
 
上面只是用图简单模拟下BFS过程中怎么记录转弯次数,当然这是最简单的情况。
 
 
 
思路:对队列里面的坐标(x,y)做选择时,每次选择一个方向(共四个方向)走到不能走为止,将沿途经过的所有used值 = -1的点入队并更新used值(对used不为-1的点不作处理)。队列为空还无法到终点,输出no。若能遍历到终点,判断used值是否大于要求的k,若大于输出no,否则输出yes。
 
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<queue>
  4. #define MAX 110
  5. using namespace std;
  6. char map[MAX][MAX];
  7. int vis[MAX][MAX];
  8. int n,m;
  9. int w,x1,x2,y1,y2;
  10. void getmap()
  11. {
  12. int i,j;
  13. for(i=1;i<=n;i++)
  14. {
  15. getchar();
  16. for(j=1;j<=m;j++)
  17. {
  18. scanf("%c",&map[i][j]);
  19. }
  20. }
  21. }
  22. struct node
  23. {
  24. int x,y;
  25. };
  26. int judge(int x,int y)
  27. {
  28. if(x>0&&x<=n&&y>0&&y<=m&&map[x][y]!='*')
  29. return 1;
  30. return 0;
  31. }
  32. void bfs()
  33. {
  34. int move[4][2]={0,1,0,-1,1,0,-1,0};
  35. int i,j,ok=0;
  36. queue<node>q;
  37. node beg,end;
  38. beg.x=x1;
  39. beg.y=y1;
  40. q.push(beg);
  41. while(!q.empty())
  42. {
  43. end=q.front();
  44. q.pop();
  45. if(end.x==x2&&end.y==y2)
  46. {
  47. if(vis[end.x][end.y]<=w)
  48. {
  49. printf("yes\n");
  50. ok=1;
  51. }
  52. else
  53. break;
  54. }
  55. else
  56. {
  57. for(i=0;i<4;i++)
  58. {
  59. beg.x=end.x+move[i][0];
  60. beg.y=end.y+move[i][1];
  61. while(judge(beg.x,beg.y))
  62. {
  63. if(vis[beg.x][beg.y]==-1)
  64. {
  65. vis[beg.x][beg.y]=vis[end.x][end.y]+1;
  66. q.push(beg);
  67. }
  68. beg.x+=move[i][0];//沿着这个方向继续走
  69. beg.y+=move[i][1];
  70. }
  71. }
  72. }
  73. }
  74. if(!ok)
  75. printf("no\n");
  76. }
  77. int main()
  78. {
  79. int t;
  80. scanf("%d",&t);
  81. while(t--)
  82. {
  83. scanf("%d%d",&n,&m);
  84. getmap();
  85. scanf("%d%d%d%d%d",&w,&y1,&x1,&y2,&x2);
  86. memset(vis,-1,sizeof(vis));
  87. bfs();
  88. }
  89. return 0;
  90. }

  

hdoj 1728 逃离迷宫的更多相关文章

  1. BFS HDOJ 1728 逃离迷宫

    题目传送门 /* BFS:三维BFS,加上方向.用dp[x][y][d]记录当前需要的最少转向数 */ #include <cstdio> #include <algorithm&g ...

  2. hdu 1728 逃离迷宫 bfs记转向

    题链:http://acm.hdu.edu.cn/showproblem.php?pid=1728 逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Mem ...

  3. hdu 1728 逃离迷宫 bfs记步数

    题链:http://acm.hdu.edu.cn/showproblem.php?pid=1728 逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Mem ...

  4. HDU 1728 逃离迷宫(DFS)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1728 题目: 逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)  ...

  5. HDU 1728 逃离迷宫(DFS经典题,比赛手残写废题)

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

  6. hdu 1728 逃离迷宫 [ dfs ]

    传送门 逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

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

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

  8. HDU 1728 逃离迷宫(DFS||BFS)

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

  9. hdu 1728 逃离迷宫 (BFS)

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

随机推荐

  1. one way WebService

    WSDL支持4种消息交换方式:   1)单向(One-way):服务端接收消息:   2)请求响应(Request-response):服务端点接收请求消息,然后发送响应消息:   3)要求应答(So ...

  2. 关于webservice不支持方法重载的解决办法

    今天在写WebService时,出现了这样的错误: Count(Int32, Int32) 和 Count(Int32) 同时使用消息名称“Count”.使用 WebMethod 自定义特性的 Mes ...

  3. Log4j配置的经典总结,打印日志文件,日志存库

        一.介绍 Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制 日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务 器.NT的事件记录器.UNIX Sy ...

  4. cocos2d中如何使用图片纹理图集的加载来实现一个动画的功能

    cocos2d中要实现一个动画,一般采用纹理图集的方式,也就是说把几个连续动作的图片挨个显示切换这样就是动画 一: 首先先看下今天要实现的具体的目的,打飞机的时间屏幕上会有一个喷火的小飞机,飞机的尾部 ...

  5. C#模拟POST提交表单(二)--HttpWebRequest以及HttpWebResponse

    上次介绍了用WebClient的方式提交POST请求,这次,我继续来介绍用其它一种方式 HttpWebRequest以及HttpWebResponse 自认为与上次介绍的WebClient最大的不同之 ...

  6. this的一个作用 当前对象

    class Person{ String name="小花"; int age=19; void eat(){  System.out.println("在吃饭" ...

  7. MySQL数据库服务器 主从配置

    A B 为两台 MySQL 服务器,均开启二进制日志,数据库版本 MySQL 5.5 一.服务器参数   [A 服务器 192.168.1.100] server-id = 1 binlog-do-d ...

  8. Sublime text3 JS语法检测工具安装及使用

    Sublime text3 JS语法检测工具安装及使用 工具/原料 sublime text3 nodejs sublimeLinter sublimeLinter-jshint 方法/步骤 首先ct ...

  9. Bootstrap 和 LESS

    Bootstrap 简介 什么是 Bootstrap? Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的 ...

  10. Unity干中学——如何实现类似Windows Store 应用程序和Android Toast的通知?

    要实现通知中心功能,首先要创建一个游戏物体,在上面挂载GUITeture和GUIText脚本.注意GUITexture和GUIText脚本的顺序,GUITexture在前,GUIText在后,否则GU ...