题目链接

Problem Description

Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向.

比如下面的例子里,一开始楼梯在竖直方向,一分钟以后它移动到了水平方向,再过一分钟它又回到了竖直方向.Harry发现对他来说很难找到能使得他最快到达目的地的路线,这时Ron(Harry最好的朋友)告诉Harry正好有一个魔法道具可以帮助他寻找这样的路线,而那个魔法道具上的咒语,正是由你纂写的.

Input

测试数据有多组,每组的表述如下:

第一行有两个数,M和N,接下来是一个M行N列的地图,'*'表示障碍物,'.'表示走廊,'|'或者'-'表示一个楼梯,并且标明了它在一开始时所处的位置:'|'表示的楼梯在最开始是竖直方向,'-'表示的楼梯在一开始是水平方向.地图中还有一个'S'是起点,'T'是目标,0<=M,N<=20,地图中不会出现两个相连的梯子.Harry每秒只能停留在'.'或'S'和'T'所标记的格子内.

Output

只有一行,包含一个数T,表示到达目标的最短时间.

注意:Harry只能每次走到相邻的格子而不能斜走,每移动一次恰好为一分钟,并且Harry登上楼梯并经过楼梯到达对面的整个过程只需要一分钟,Harry从来不在楼梯上停留.并且每次楼梯都恰好在Harry移动完毕以后才改变方向.

Sample Input

5 5

**..T

**..

..|..

.
.*.

S....

Sample Output

7

分析:

这里有一个比较难得地方就是对于走到楼梯的地方时他能不能走,如何走花费的时间比较短,这里对于楼梯的判断要写一个具体的函数来判断。

代码:

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<queue>
  4. #include<iostream>
  5. using namespace std;
  6. char tu[21][21];
  7. int bj[21][21];
  8. int sx,sy,ex,ey,n,m;
  9. int nex1[4][2]= {{1,0},{-1,0},{0,1},{0,-1} };
  10. struct node
  11. {
  12. int x;
  13. int y;
  14. int step;
  15. } now,nex;
  16. bool operator <(node a,node b)
  17. {
  18. return a.step>b.step;
  19. }
  20. int solve(int x,int y,int time,char ch)
  21. {
  22. if(ch == '|' && x == 0)//如果楼梯是竖着的,而且我在水平方向上
  23. {
  24. if(time%2==0)//偶数步,则楼梯还是竖着的,等一秒楼梯变成平的,在过去
  25. time+=2;
  26. else
  27. time++;
  28. }
  29. if(ch == '|' && y == 0)//如果楼梯是竖着的,处于竖直方向上
  30. {
  31. if(time%2==0)//偶数步,楼梯为竖直的,这时候直接过去
  32. time++;
  33. else
  34. time+=2;//否则等一秒,楼梯变成竖着的过去
  35. }
  36. if(ch == '-' && x == 0)//如果楼梯是横着的,现在在水平方向上
  37. {
  38. if(time%2 == 0)//偶数步,到达楼梯前一个位置楼梯还是横的,直接过去
  39. time++;
  40. else
  41. time+=2;//否则,等一分钟楼梯变成横的在过去
  42. }
  43. if(ch == '-' && y == 0)//如果楼梯是横着的,现在在竖直方向上
  44. {
  45. if(time%2==0)//偶数步,楼梯是当前是横着的,过不去,再等一秒
  46. time+=2;
  47. else
  48. time++;//否则直接过去。
  49. }
  50. return time;
  51. }
  52. void bfs(int x,int y)
  53. {
  54. priority_queue<node>q;
  55. now.x=x;
  56. now.y=y;
  57. now.step=0;
  58. q.push(now);
  59. while(!q.empty())
  60. {
  61. now=q.top();
  62. q.pop();
  63. if(now.x==ex&&now.y==ey)
  64. {
  65. cout<<now.step<<endl;
  66. return ;
  67. }
  68. for(int i=0; i<4; i++)
  69. {
  70. nex.x=now.x+nex1[i][0];
  71. nex.y=now.y+nex1[i][1];
  72. if(tu[nex.x][nex.y]!='*'&&nex.x>=0&&nex.x<n&&nex.y>=0&&nex.y<m&&bj[nex.x][nex.y]==0)
  73. {
  74. if(tu[nex.x][nex.y]=='.'||tu[nex.x][nex.y]=='T')
  75. {
  76. nex.step=now.step+1;
  77. bj[nex.x][nex.y]=1;
  78. q.push(nex);
  79. }
  80. else if(tu[nex.x][nex.y]=='|'||tu[nex.x][nex.y]=='-')
  81. {
  82. int tx=nex.x+nex1[i][0];
  83. int ty=nex.y+nex1[i][1];
  84. if(tx>=0&&tx<n&&ty>=0&&ty<m&&bj[tx][ty]==0&&tu[tx][ty]!='*')
  85. {
  86. nex.step = solve(nex1[i][0],nex1[i][1],now.step,tu[nex.x][nex.y]);
  87. nex.x=tx;
  88. nex.y=ty;
  89. bj[nex.x][nex.y]=1;
  90. q.push(nex);
  91. }
  92. }
  93. }
  94. }
  95. }
  96. return ;
  97. }
  98. int main()
  99. {
  100. while(~scanf("%d%d",&n,&m))
  101. {
  102. memset(bj,0,sizeof(bj));
  103. for(int i=0; i<n; i++)
  104. for(int j=0; j<m; j++)
  105. {
  106. cin>>tu[i][j];
  107. if(tu[i][j]=='S')
  108. {
  109. sx=i;
  110. sy=j;
  111. }
  112. if(tu[i][j]=='T')
  113. {
  114. ex=i;
  115. ey=j;
  116. }
  117. }
  118. bj[sx][sy]=1;
  119. bfs(sx,sy);
  120. }
  121. return 0;
  122. }

HDU 1180 诡异的楼梯 (广搜)的更多相关文章

  1. HDU 1180 诡异的楼梯(超级经典的bfs之一,需多回顾)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1180 诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others)     ...

  2. hdu 1180:诡异的楼梯(BFS广搜)

    诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Subm ...

  3. hdu 1180 诡异的楼梯(广搜,简单)

    题目 挺简单的一道广搜题,只要用判断时间是偶数还是奇数就可以判断楼梯的方位,但是我这傻逼居然写了那么久啊那么久,我果然秀逗了,,,, #define _CRT_SECURE_NO_WARNINGS # ...

  4. HDOJ/HDU 1180 诡异的楼梯(经典BFS-详解)

    Problem Description Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向. 比如下面的例子里,一开始楼梯在 ...

  5. hdu 1180 诡异的楼梯

    诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Subm ...

  6. hdu 1180 诡异的楼梯 (bfs)

    诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Sub ...

  7. HDU 1180 诡异的楼梯(BFS)

    诡异的楼梯 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status ...

  8. hdu 1180诡异的楼梯(bfs)

    诡异的楼梯 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Total Submis ...

  9. HDU 1180 诡异的楼梯【BFS/楼梯随时间变化】

    诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Submis ...

随机推荐

  1. 在mysql启用远程连接

    1.在ubuntu下面安装mysql. apt-get install mysql-server mysql-client -y 2.修改/etc/mysql/my.cnf文件. #bind-addr ...

  2. loadrunner如何监控windows系统的资源

    1.测试客户端与服务器之间的网络,保证通信畅通 2.开启服务器端Windows中的如下两个服务,可见系统服务中查找,cmd输入:services.msc 如下图: Remote Registry需改为 ...

  3. adb shell input keyevent值所对应的字符

    转自:http://blog.csdn.net/chen825919148/article/details/18732041 0 -->  "KEYCODE_UNKNOWN" ...

  4. 关于&$地址传递的练习

    php默认为传值传递: 既: $a=10;$b=$a; //$b为10$a=+10; //$a 为20 echo $a.'和'.$b;  # $a is 20 and $b is 10! 要是想变为地 ...

  5. (转)Linux NUMA引发的性能问题

    最近某客户的核心业务系统又出了翻译缓慢的情况.该问题在6月份也出现过,当时进行了一次调整. 我们首先来看下故障时间段的awr报告: 单纯的从TOP 5 event,基本上是看不出任何东西的,可能有人会 ...

  6. C/S结构 B/S结构

    [1]C/S 结构,即大家熟知的客户机和服务器结构.它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销.目前大多数应 ...

  7. Redis 学习之集群

    该文使用centos6.5 64位  redis3.2.8 一.  redis-cluster架构图 集群通信:所有redis节点之间通过PING-PONG机制彼此互联,内部使用二进制鞋子优化传输速度 ...

  8. Bootstrap 轮播图的使用和理解

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...

  9. 【EF】EF实现大批量数据库插入操作

    通过参考http://www.itnose.net/news/171/6306259里面介绍的方法,我们可以在程序的解决方案的引用中选择NuGet管理包中添加  该扩展方法提供BulkInsert() ...

  10. hadoop 使用Avro排序

    在上例中,使用Avro框架求出数据的最大值,本例使用Avro对数据排序,输入依然是之前的样本,输出使用文本(也可以输出Avro格式). 1.在Avro的Schema中直接设置排序方向. dataRec ...