诡异的楼梯
来源:互联网 发布:linux查找rpm包位置 编辑:程序博客网 时间:2024/06/02 11:09
诡异的楼梯
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 14329 Accepted Submission(s): 3654
Problem Description
Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向.
比如下面的例子里,一开始楼梯在竖直方向,一分钟以后它移动到了水平方向,再过一分钟它又回到了竖直方向.Harry发现对他来说很难找到能使得他最快到达目的地的路线,这时Ron(Harry最好的朋友)告诉Harry正好有一个魔法道具可以帮助他寻找这样的路线,而那个魔法道具上的咒语,正是由你纂写的.
比如下面的例子里,一开始楼梯在竖直方向,一分钟以后它移动到了水平方向,再过一分钟它又回到了竖直方向.Harry发现对他来说很难找到能使得他最快到达目的地的路线,这时Ron(Harry最好的朋友)告诉Harry正好有一个魔法道具可以帮助他寻找这样的路线,而那个魔法道具上的咒语,正是由你纂写的.
Input
测试数据有多组,每组的表述如下:
第一行有两个数,M和N,接下来是一个M行N列的地图,'*'表示障碍物,'.'表示走廊,'|'或者'-'表示一个楼梯,并且标明了它在一开始时所处的位置:'|'表示的楼梯在最开始是竖直方向,'-'表示的楼梯在一开始是水平方向.地图中还有一个'S'是起点,'T'是目标,0<=M,N<=20,地图中不会出现两个相连的梯子.Harry每秒只能停留在'.'或'S'和'T'所标记的格子内.
第一行有两个数,M和N,接下来是一个M行N列的地图,'*'表示障碍物,'.'表示走廊,'|'或者'-'表示一个楼梯,并且标明了它在一开始时所处的位置:'|'表示的楼梯在最开始是竖直方向,'-'表示的楼梯在一开始是水平方向.地图中还有一个'S'是起点,'T'是目标,0<=M,N<=20,地图中不会出现两个相连的梯子.Harry每秒只能停留在'.'或'S'和'T'所标记的格子内.
Output
只有一行,包含一个数T,表示到达目标的最短时间.
注意:Harry只能每次走到相邻的格子而不能斜走,每移动一次恰好为一分钟,并且Harry登上楼梯并经过楼梯到达对面的整个过程只需要一分钟,Harry从来不在楼梯上停留.并且每次楼梯都恰好在Harry移动完毕以后才改变方向.
注意:Harry只能每次走到相邻的格子而不能斜走,每移动一次恰好为一分钟,并且Harry登上楼梯并经过楼梯到达对面的整个过程只需要一分钟,Harry从来不在楼梯上停留.并且每次楼梯都恰好在Harry移动完毕以后才改变方向.
Sample Input
5 5**..T**.*...|...*.*.S....
Sample Output
7地图如下:解题报告:这道题其实并没有说明,是否可以在遇到楼梯后等一秒,但以防万一就考虑进去。这样就可以用优先队列,每次出队的是最短的时间。code:HintHint#include<cstdio>#include<iostream>#include<cstring>#include<string>#include<sstream>#include<algorithm>#include<math.h>#include<queue>#include<stack>#include<map>#include<set>using namespace std;typedef long long ll;const int maxn =25;char a[maxn][maxn];int m,n;int dx[4]={-1,0,0,1,};int dy[4]={0,1,-1,0};int visited[maxn][maxn];struct node{ int x,y,step; bool operator < (const node &a) const { return step>a.step; }};int isOk(int xx,int yy){ if(xx<0||xx>=m||yy<0||yy>=n||visited[xx][yy]||a[xx][yy]=='*') return 0; else return 1;}int bfs(int x,int y){ priority_queue<node> q; node r; r.x=x; r.y=y; r.step=0; q.push(r); visited[x][y]=1; while(!q.empty()){ r=q.top();/*优先队列,每次取时间最短的*/ q.pop(); for(int i=0;i<4;i++){ int xx=r.x+dx[i]; int yy=r.y+dy[i]; if(!isOk(xx,yy)) continue; node t; t.x=xx;t.y=yy;t.step=r.step+1; if(a[xx][yy]=='|' ||a[xx][yy]=='-'){ char ch; if(a[xx][yy]=='|'){ /*确定梯子的方向*/ if(r.step%2==0) ch='|'; else ch='-'; }else{ if(r.step%2==0) ch='-'; else ch='|'; } if(ch=='|' && (dy[i]==1 ||dy[i]==-1)){ /*停留一秒*/ t.step+=1; } if(ch=='-' && (dx[i]==1 ||dx[i]==-1)){ /*停留一秒*/ t.step+=1; } t.x+=dx[i];/*走上梯子到达对面*/ t.y+=dy[i]; } if(isOk(t.x,t.y)){/*有可能梯子在边界处*/ if(a[t.x][t.y]=='T') return t.step; visited[t.x][t.y]=1; q.push(t); } } } return 0;}int main(){ // freopen("input.txt","r",stdin); while(~scanf("%d%d",&m,&n)){ int x,y; memset(visited,0,sizeof(visited)); for(int i=0;i<m;i++){ getchar(); for(int j=0;j<n;j++){ scanf("%c",&a[i][j]); if(a[i][j]=='S'){ x=i;y=j; } } } printf("%d\n",bfs(x,y)); } return 0;}
1 0
- hdu1180 诡异的楼梯
- BFS+诡异的楼梯
- 诡异的楼梯
- 诡异的楼梯
- HDU1180 诡异的楼梯
- hdu1180 诡异的楼梯
- hdu1180诡异的楼梯
- hdu 诡异的楼梯
- 诡异的楼梯
- HDU1180 诡异的楼梯
- hdoj1180 诡异的楼梯
- 诡异的楼梯
- HDU:诡异的楼梯
- hdu 诡异的楼梯
- 诡异的楼梯
- HDU1180-诡异的楼梯
- 诡异的楼梯
- 诡异的楼梯 HDU
- 利用STC12C5A60S2单片机内容的PWM信号,驱动电机控制芯片MX214B实现小风扇的转动
- .a和.framework的区别
- 【深入Java虚拟机】之七:Javac编译与JIT编译
- 39. Combination Sum
- 1067. 试密码(20)
- 诡异的楼梯
- 【深入Java虚拟机】之八:Java垃圾收集机制
- echarts如何让坐标轴的数据显示完全
- linux下普通文件和目录文件区别
- Tkinter(python-GUI)
- redis集群搭建
- 工厂方法模式
- Java基础:面向对象(1)--对象的概念、成员变量与局部变量、匿名对象、类的封装
- Flask-自定义头像