HDU 1180 诡异的楼梯

来源:互联网 发布:淘宝邀请的活动好不好 编辑:程序博客网 时间:2024/06/09 18:55

诡异的楼梯

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)
Total Submission(s): 15153    Accepted Submission(s): 3969


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

Source
Gardon-DYGG Contest 1
 

Recommend
JGShining

题意:楼梯每秒在转到,在楼梯上可以直接走过去,求到达终点所需要的时间。
自己做的时候完全没有注意到楼梯方向不与当前前进方向一致时可以不动这一点,一直WA,T_T,发现这一点后就好做多了。

#include<iostream>#include<cstdio>#include<algorithm>#include<map>#include<set>#include<utility>#include<queue>#include<deque>#include<stack>#include<cstring>#include<string>#include<cmath>using namespace std;typedef long long ll;#define mem(i,a) memset(i,a,sizeof i)#define for1(i,a) for(int (i)=1;(i)<=(a);(i)++)#define for0(i,a) for(int (i)=0;(i)<(a);(i)++)#define pi acos(-1.0)#define eps 1e-10#define _f first#define _s secondchar g[101][101];bool vis[101][101];int m,n,i,j,k;const int dx[]={0,0,0,1,-1,0};const int dy[]={0,1,-1,0,0,0};struct Node{    int x,y,t;    Node(int x,int y,int t):x(x),y(y),t(t){}};bool check(Node p){    if(p.x<1||p.x>m||p.y<1||p.y>n||vis[p.x][p.y]||g[p.x][p.y]=='*')return 0;    if(g[p.x][p.y]=='|'||g[p.x][p.y]=='-')return 0;//在楼梯上也判断返回,这与下面的写法有关,每个人方法可能不太一样    return 1;}queue<Node>que;void solve(){    while(!que.empty())    {        int tag=1;        Node tmp=que.front();        que.pop();        if(g[tmp.x][tmp.y]=='T')        {            printf("%d\n",tmp.t);//到达终点,输出            return ;        }        for1(i,4)        {            Node p=tmp;            p.x+=dx[i];            p.y+=dy[i];            p.t++;            if(g[p.x][p.y]=='|')            {                if(!(p.t&1)&&(i==1||i==2))//判断楼梯方向与自己前进方向是否一致,容易搞反,我是先走再判断是否在楼梯上                    p.x+=dx[i],p.y+=dy[i];                else if(p.t&1&&(i==3||i==4))                    p.x+=dx[i],p.y+=dy[i];                else                    tmp.t++,que.push(tmp);//如果楼梯与自己方向不一致,时间加一,再次压入队列,没这一个和下面一个就会WA            }            else if(g[p.x][p.y]=='-')            {                if(!(p.t&1)&&(i==3||i==4))                    p.x+=dx[i],p.y+=dy[i];                else if(p.t&1&&(i==1||i==2))                    p.x+=dx[i],p.y+=dy[i];                else                    tmp.t++,que.push(tmp);            }            if(check(p))            {                vis[p.x][p.y]=1;                que.push(p);            }        }    }}int main(){    while(~scanf("%d%d",&m,&n))    {        mem(vis,0);        while(!que.empty())            que.pop();        for1(i,m)            for1(j,n)            {                cin>>g[i][j];                if(g[i][j]=='S')                    vis[i][j]=1,que.push(Node(i,j,0));            }        solve();    }    return 0;}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 宝宝甲低300多怎么办 两岁半宝宝还不怎么会讲话怎么办 宝宝两岁半了还不讲话怎么办 两岁宝宝怕生人怎么办 四岁宝宝不说话怎么办 1岁宝宝牙齿黄斑怎么办 儿子俩周半了就是不说话怎么办 两岁宝宝牙齿上有黑渍怎么办 两岁宝宝牙齿发黑怎么办 求帮助宝宝刷牙不会漱口怎么办 牙膏不小心吞了怎么办 宝宝误吃了牙膏怎么办 宝宝吃了30g牙膏怎么办 孩子把牙膏吞了怎么办 二岁宝宝有蛀牙怎么办 3岁宝宝有蛀牙了怎么办 三岁宝宝夜惊怎么办 小班孩子跳舞不好好跳怎么办 15个月宝宝拉稀怎么办 孩子学习不认真该怎么办 孩子学习不自觉该怎么办 孩子学习压力大该怎么办 分手发信息不回怎么办 两岁宝宝不会回答问题怎么办 分手了我还想他怎么办 两岁宝宝特别不听话怎么办 2岁宝宝争东西怎么办 两岁宝宝钙吸收不好怎么办 1岁宝宝害羞胆小怎么办 2岁宝宝害羞胆小怎么办 6个月的宝宝胆小怎么办 3岁半宝宝很胆小怎么办 分手了想他了怎么办 分手了还想联系怎么办 2岁多宝宝不长肉怎么办 2个月宝宝尿裤子怎么办 四岁宝宝脾气大怎么办 两周宝宝换奶粉怎么办 两周半宝宝不喝奶粉怎么办 2岁半宝宝太调皮怎么办 2岁宝宝晚上睡觉晚怎么办