HDU 1180 诡异的楼梯
2015-07-14 16:41
513 查看
[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]
[align=left]Sample Output[/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 要考虑好多 WA了好几遍 也参考了别人的代码 不段优化出来#include <iostream> #include <queue> using namespace std; int n,m,s,xx[4][2]={{1,0},{0,1},{-1,0},{0,-1}},visit[22][22],vis[22][22]; int x1,y1,x2,y2; char map[22][22]; int i,j,k,l,x,y,X,Y,step; struct Q { int x,y,step; }now; queue<Q> q,qq; bool pd(int x,int y) { if(x>=0&&y>=0&&x<n&&y<m&&visit[x][y]&&map[x][y]!='*') return 1; return 0; } void bfs() { while(!q.empty()) { now=q.front(); q.pop(); X=now.x; Y=now.y; step=now.step; if(map[X][Y]=='T') { s=step; return; } for(i=k=0;i<4;i++) { x=X+xx[i][0]; y=Y+xx[i][1]; if(pd(x,y)) { if(map[x][y]=='|') { x+=xx[i][0]; y+=xx[i][1]; if(!pd(x,y)) continue; if(i%2==0&&step%2==0||i%2==1&&step%2==1) visit[x][y]=0,now.x=x,now.y=y,now.step=step+1,q.push(now); else if(vis[x][y]) vis[x][y]=0,now.x=X,now.y=Y,now.step=step+1,q.push(now); } else if(map[x][y]=='-') { x+=xx[i][0]; y+=xx[i][1]; if(!pd(x,y)) continue; if(i%2==0&&step%2==1||i%2==1&&step%2==0) visit[x][y]=0,now.x=x,now.y=y,now.step=step+1,q.push(now); else if(vis[x][y]) vis[x][y]=0,now.x=X,now.y=Y,now.step=step+1,q.push(now); } else visit[x][y]=0,now.x=x,now.y=y,now.step=step+1,q.push(now); } } } } int main (void) { int i,j,k,l; while(cin>>n>>m) { for(i=0;i<n;i++) for(j=0;j<m;j++) { cin>>map[i][j]; visit[i][j]=vis[i][j]=1; if(map[i][j]=='S')x1=i,y1=j; if(map[i][j]=='T')x2=i,y2=j; } now.x=x1; now.y=y1; now.step=0; q.push(now); visit[x1][y1]=0; s=0; bfs(); cout<<s<<endl; } return 0; }
相关文章推荐
- strcpy()函数编译报错
- 异步编程:When.js快速上手
- C/C++/Fortran混合编程浅谈------直接链接方式
- AP算法java实现
- 利用freemarker 静态化网页
- [LeetCode]#4 Median of Two Sorted Arrays
- python3入门之列表和元组
- Python之 sort和sorted
- iOS开发笔记--如何去掉UItableview header(footer)view黏性(sticky)
- argc与argv[]
- 解决nginx无法启动, bind() to 0.0.0.0:8080 failed的错误
- SQLite数据库操作流程
- SessionHelper
- 类加载器--java静态方法静态变量
- Mysql允许用户远程连接
- HDU-1040- As Easy As A+B-选择排序+冒泡排序
- POJ - 3311 Hie with the Pie (状态压缩)
- linux c获取IP地址
- caffe --- 网络参数
- 苹果官方帮助文档