HDU1180 诡异的楼梯

来源:互联网 发布:淘宝网警用手铐脚铐 编辑:程序博客网 时间:2024/05/17 00:10
N - 诡异的楼梯
Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u
Submit Status

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 地图如下:         
 

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<queue>#include<string>using namespace std;const int INF=0x3f3f3f3f;const int MAXN=25;const int MAXM=25;int n,m,i,j,T;int done[MAXN][MAXM];int sx,sy,ex,ey;char map[MAXN][MAXM];int dx[]={0,0,1,-1};//右左下上int dy[]={1,-1,0,0};int en,p[MAXN][MAXM];struct node{int x,y,t;node(int xx=0,int yy=0,int tt=0){x=xx;y=yy;t=tt;}friend operator<(const node &a,const node &b){return a.t>b.t;}};bool is_ill(int x,int y){if(x<0||x>=n||y<0||y>=m)return 1;if(map[x][y]=='*'||done[x][y])return 1;return 0;}int bfs()  {       priority_queue<node>q;      memset(done,0,sizeof(done));      q.push(node(sx,sy,0));      done[sx][sy]=1;      while(!q.empty())      {          node e=q.top();q.pop();        for(i=0;i<4;i++)          {                        if(map[e.x][e.y]=='-'&&e.t%2==0&&(i==2||i==3))continue;if(map[e.x][e.y]=='-'&&e.t%2==1&&(i==0||i==1))continue;if(map[e.x][e.y]=='|'&&e.t%2==0&&(i==0||i==1))continue;if(map[e.x][e.y]=='|'&&e.t%2==1&&(i==2||i==3))continue;         int curx=e.x+dx[i];              int cury=e.y+dy[i];  int curt=e.t+1;if(is_ill(curx,cury))continue;  if(map[curx][cury]=='-'){if(e.t%2==0&&(i==2||i==3))q.push(node(curx,cury,curt));else if (e.t%2==1&&(i==0||i==1))q.push(node(curx,cury,curt));else q.push(node(curx,cury,curt-1));continue;}if(map[curx][cury]=='|'){if(e.t%2==1&&(i==2||i==3))q.push(node(curx,cury,curt));else if (e.t%2==0&&(i==0||i==1))q.push(node(curx,cury,curt));else q.push(node(curx,cury,curt-1));continue;}if(curx==ex&&cury==ey)                return curt;done[curx][cury]=1;q.push(node(curx,cury,curt));        }    }      return -1;  } int main(){//freopen("123.txt","r",stdin);while(~scanf("%d%d",&n,&m)){gets(map[0]);for(i=0;i<n;i++)gets(map[i]);for(i=0;i<n;i++)for(j=0;j<m;j++){if(map[i][j]=='S'){sx=i;sy=j;map[i][j]='.';}if(map[i][j]=='T'){ex=i;ey=j;map[i][j]='.';}}int ans=bfs();printf("%d\n",ans);}return 0;}

0 0