诡异的楼梯

来源:互联网 发布: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正好有一个魔法道具可以帮助他寻找这样的路线,而那个魔法道具上的咒语,正是由你纂写的.
 

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
Hint
Hint
地图如下:解题报告:这道题其实并没有说明,是否可以在遇到楼梯后等一秒,但以防万一就考虑进去。这样就可以用优先队列,每次出队的是最短的时间。code:
#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
原创粉丝点击