HDU 1180 诡异的楼梯(BFS+奇偶步数判断)
2015-09-07 18:32
405 查看
诡异的楼梯
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 11043 Accepted Submission(s): 2753
[align=left]Problem Description[/align]
Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向.
比如下面的例子里,一开始楼梯在竖直方向,一分钟以后它移动到了水平方向,再过一分钟它又回到了竖直方向.Harry发现对他来说很难找到能使得他最快到达目的地的路线,这时Ron(Harry最好的朋友)告诉Harry正好有一个魔法道具可以帮助他寻找这样的路线,而那个魔法道具上的咒语,正是由你纂写的.
[align=left]Input[/align]
测试数据有多组,每组的表述如下:
第一行有两个数,M和N,接下来是一个M行N列的地图,'*'表示障碍物,'.'表示走廊,'|'或者'-'表示一个楼梯,并且标明了它在一开始时所处的位置:'|'表示的楼梯在最开始是竖直方向,'-'表示的楼梯在一开始是水平方向.地图中还有一个'S'是起点,'T'是目标,0<=M,N<=20,地图中不会出现两个相连的梯子.Harry每秒只能停留在'.'或'S'和'T'所标记的格子内.
[align=left]Output[/align]
只有一行,包含一个数T,表示到达目标的最短时间.
注意:Harry只能每次走到相邻的格子而不能斜走,每移动一次恰好为一分钟,并且Harry登上楼梯并经过楼梯到达对面的整个过程只需要一分钟,Harry从来不在楼梯上停留.并且每次楼梯都恰好在Harry移动完毕以后才改变方向.
[align=left]Sample Input[/align]
5 5 **..T **.*. ..|.. .*.*. S....
[align=left]Sample Output[/align]
7 HintHint 地图如下:
[align=left]Source[/align]
Gardon-DYGG Contest 1
//分析:这题其实不难 但是又个坑 坑死我了!本题几乎都会想到bfs 但是一点就是遇到楼梯时过去那边的点也要判断,不然会出现楼梯来回跳
//还有就是标记一次就可以了 因为bfs可以枚举每一秒逐渐扩散 如果走过了 证明存在更快的走法 所以不走
//AC代码 没用优先队列
#include <iostream> #include <cstdio> #include <queue> #include <string.h> #include <string> using namespace std; const int N=20+5; int step[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; // 0上 1下 2左 3右 char map ; bool book ; int n,m; struct Node{ int x,y,sum; }tmp,node; queue<Node> q; int main(){ int i,j; char c ; bool ok; while(scanf("%d%d",&n,&m)==2){ while(!q.empty()) q.pop(); for(i=0;i<n;i++){ scanf("%s",map[i]); for(j=0;j<m;j++) { book[i][j]=0; if(map[i][j]=='S'){ node.x=i; node.y=j; node.sum=0; book[i][j]=1; } } } q.push(node); while(!q.empty()){ node=q.front(); // printf("%d %d %d\n",node.x, node.y,node.sum); q.pop(); if(map[node.x][node.y]=='T') break; for(i=0;i<4;i++){ int a=node.x+step[i][0]; int b=node.y+step[i][1]; if(a<0||a>=n||b<0||b>=m||book[a][b]==1||map[a][b]=='*') continue; if(map[a][b]=='|'){ if((i<=1&&(node.sum)%2==0)|| (i>=2&&(node.sum)%2==1)) { a=a+step[i][0]; b=b+step[i][1]; //判断梯子对面走过没 (重点 坑死我了) if(a<0||a>=n||b<0||b>=m||book[a][b]==1||map[a][b]=='*') continue; tmp.x=a; tmp.y=b; tmp.sum=node.sum+1; } else { tmp.sum=node.sum+1; tmp.x=node.x; tmp.y=node.y; } } else if(map[a][b]=='-'){ if((i<=1&&(node.sum)%2==1) ||(i>=2&&(node.sum)%2==0)){ a=a+step[i][0]; b=b+step[i][1]; //判断梯子对面走过没 (重点 坑死我了) if(a<0||a>=n||b<0||b>=m||book[a][b]==1||map[a][b]=='*') continue; tmp.x=a; tmp.y=b; tmp.sum=node.sum+1; } else { tmp.sum=node.sum+1; tmp.x=node.x; tmp.y=node.y; } } else{ tmp.x=a; tmp.y=b; tmp.sum=node.sum+1; } book[tmp.x][tmp.y]=1; q.push(tmp); } } printf("%d\n",node.sum); } return 0; }
相关文章推荐
- 初探git 本地和远程仓库的操作
- 正则表达式———通俗易懂———边讲解边举例
- POJ3673解题报告
- linux运维实战练习-2015年9月5日课程作业
- android点击两侧返回键退出应用
- 1073. Scientific Notation (20)
- Druid原理介绍(1)
- Android中ListView的item按钮监听错乱问题解决办法 推荐
- Windows下Anaconda的安装和简单使用
- HASH表实现
- Trie树(压缩Trie树及Double-Array Trie)
- UE4 computing lightmap UV mapping in SpeedTree
- two sample ttest & paired ttst
- JXL获取excel批注
- 高仿58同城的Gridview
- JAVA高并发学习笔记(二) 多线程基础
- 正反方向传值及打地鼠游戏的实现
- linux下IPTABLES配置详解
- quick-cocos2d-x基于源码加密打包功能的更新策略(3)
- (function(){})(),function(){}()的相关探究