HDU 1180 诡异的楼梯

来源:互联网 发布:flashfxp mac 中文 编辑:程序博客网 时间:2024/06/02 11:35
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         思路:对行走路线进行一波模拟就可以了,本来是上下左右四个方向,现在再添加一个方向,这个方向就是原地不动,时间+1s,因为反应在队列中是一段一段行走时间相同的点
所以找到的答案肯定也是最优的,下面给出AC代码:
#include<stdio.h>#include<queue>#include<string.h>#include<algorithm>using namespace std;char mapp[30][30];int dir[4][2]= {0,1,0,-1,-1,0,1,0};struct aa{    int x,y,time;} t,tt;void bfs(int sx,int sy,int ex,int ey){    queue<struct aa>ycq;    mapp[sx][sy]='*';    t.x=sx,t.y=sy,t.time=0;    ycq.push(t);    while(!ycq.empty())    {        t=ycq.front();        ycq.pop();        if(t.x==ex&&t.y==ey)//一定最优        {            printf("%d\n",t.time);            return ;        }        for(int i=0; i<4; i++)//四个方向        {            int xx=t.x+dir[i][0];            int yy=t.y+dir[i][1];            if(mapp[xx][yy]&&mapp[xx][yy]!='*')            {                if(mapp[xx][yy]=='-')                {                    if(i/2-t.time%2==0)//顺路                    {                        xx+=dir[i][0];                        yy+=dir[i][1];                        if(mapp[xx][yy]&&mapp[xx][yy]!='*')//下下个道路的判断                        {                            mapp[xx][yy]='*';                            tt.x=xx,tt.y=yy,tt.time=t.time+1;                            ycq.push(tt);                        }                    }                    else                    {                        tt.x=t.x,tt.y=t.y,tt.time=t.time+1;//不顺路,原地不动,等待下次开门                        ycq.push(tt);                    }                }                else if(mapp[xx][yy]=='|')//同理                {                    if(abs(i/2-t.time%2)==1)                    {                        xx+=dir[i][0];                        yy+=dir[i][1];                        if(mapp[xx][yy]&&mapp[xx][yy]!='*')                        {                            mapp[xx][yy]='*';                            tt.x=xx,tt.y=yy,tt.time=t.time+1;                            ycq.push(tt);                        }                    }                    else                    {                        tt.x=t.x,tt.y=t.y,tt.time=t.time+1;                        ycq.push(tt);                    }                }                else                {                    tt.x=xx,tt.y=yy,tt.time=t.time+1;                    mapp[xx][yy]='*';                    ycq.push(tt);                }            }        }    }}int main(){    int n,m,sx,sy,ex,ey;    while(scanf("%d%d",&n,&m)!=EOF)    {        memset(mapp,0,sizeof(mapp));        for(int i=1; i<=n; i++)        {            scanf("%s",mapp[i]+1);        }        for(int i=1; i<=n; i++)        {            for(int j=1; j<=m; j++)            {                if(mapp[i][j]=='S')                    sy=j,sx=i;                if(mapp[i][j]=='T')                    ey=j,ex=i;            }        }        bfs(sx,sy,ex,ey);    }}



原创粉丝点击