zoukankan      html  css  js  c++  java
  • hdu 1180 诡异的楼梯

    诡异的楼梯

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


    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
     
    PS:找出Bug的时候感觉自己都他妈虚脱了,dir判断方向出错,欲哭无泪啊啊啊啊啊啊啊啊
      1 //题目容易出错的问题
      2 //1.在方向判断上
      3 //2.通过不需要耗费时间
      4 //3.当不允许通过时,可等一分钟后通过
      5 //4.通过的地方不需要判重
      6 #include<cstdio>
      7 #include<cmath>
      8 #include<cstdlib>
      9 #include<iostream>
     10 #include<queue>
     11 #include<cstring>
     12 using namespace std;
     13 int xi,yj;
     14 int m,n;
     15 int dir[4][2]={{0,1},{0,-1},{-1,0},{1,0}};//右左上下,就是这的问题,代表加完之后的走向
     16 char map[25][25];
     17 int vis[25][25];
     18 struct ln{
     19     int x;
     20     int y;
     21     int t;
     22 }abc,q;
     23 
     24 bool check(int x,int y)//判断是否越界
     25 {
     26     if(x>=1&&x<=m && y>=1&&y<=n && map[x][y]!='*' && vis[x][y]==0)
     27     return true;
     28     return false;
     29 }
     30 
     31 int bfs()
     32 {
     33     int i;
     34     int xx,yy;
     35     int xxx,yyy;
     36     queue<struct ln>p;
     37     memset(vis,0,sizeof(vis));//标记初始化
     38     abc.x=xi;
     39     abc.y=yj;
     40     abc.t=0;
     41     vis[abc.x][abc.y]=1;
     42     p.push(abc);
     43     while(!p.empty())
     44     {
     45         abc=p.front();
     46         p.pop();
     47         if(map[abc.x][abc.y]=='T')
     48         return abc.t;
     49         for(i=0;i<4;i++)
     50         {
     51             xx=abc.x+dir[i][0];
     52             yy=abc.y+dir[i][1];
     53             if(check(xx,yy)==false)
     54             continue;
     55             if(map[xx][yy]=='T' || map[xx][yy]=='.')
     56             {
     57                 q.x=xx;
     58                 q.y=yy;
     59                 q.t=abc.t+1;
     60                 vis[q.x][q.y]=1;
     61                 p.push(q);
     62             }
     63             if(i>=2&&i<4)//上下
     64             {
     65                 if( (map[xx][yy]=='|'&&abc.t%2==0) || (map[xx][yy]=='-'&&abc.t%2!=0) )
     66                 {
     67                     xxx=xx+dir[i][0];
     68                     yyy=yy+dir[i][1];
     69                     if(!check(xxx,yyy))
     70                     continue;
     71                     else
     72                     {
     73                         q.x=xxx;
     74                         q.y=yyy;
     75                         q.t=abc.t+1;
     76                         vis[q.x][q.y]=1;
     77                         p.push(q);
     78                     }
     79                 }
     80                 else//即便此时无法通过,也可等1分钟后再过,所以需要重新压入
     81                 {
     82                     q.x=abc.x;
     83                     q.y=abc.y;
     84                     q.t=abc.t+1;
     85                     p.push(q);
     86                 }
     87             }
     88             else if(i<2)//左右
     89             {
     90                 if( (map[xx][yy]=='-'&&abc.t%2==0) || (map[xx][yy]=='|'&&abc.t%2!=0) )
     91                 {
     92                     xxx=xx+dir[i][0];
     93                     yyy=yy+dir[i][1];
     94                     if(!check(xxx,yyy))
     95                     continue;
     96                     else
     97                     {
     98                         q.x=xxx;
     99                         q.y=yyy;
    100                         q.t=abc.t+1;
    101                         vis[q.x][q.y]=1;
    102                         p.push(q);
    103                     }
    104                 }
    105                 else//即便此时无法通过,也可等1分钟后再过,所以需要重新压入
    106                 {
    107                     q.x=abc.x;
    108                     q.y=abc.y;
    109                     q.t=abc.t+1;
    110                     p.push(q);
    111                 }
    112             }
    113         }
    114     }
    115     return 0;
    116 }
    117 
    118 int main()
    119 {
    120     //freopen("in.txt","r",stdin);
    121     while(~scanf("%d%d",&m,&n))
    122     {
    123         int i,j;
    124         for(i=1;i<=m;i++)
    125         {
    126             getchar();
    127             for(j=1;j<=n;j++)
    128             {
    129                 scanf("%c",&map[i][j]);
    130                 if(map[i][j]=='S')
    131                 {
    132                     xi=i;
    133                     yj=j;
    134                 }
    135             }
    136         }
    137         int count;
    138         count=bfs();
    139         printf("%d
    ",count);
    140 
    141     }
    142     return 0;
    143 }
  • 相关阅读:
    IE的有条件注释
    JavaScript 正则表达式判断是否有小数点
    设置<li>前边圆点样式
    CSS3 Gradient
    z-index
    Linux下weblogic启动报错unable to get file lock的问题
    Linux下启动关闭weblogic
    Java 自动装箱与拆箱(Autoboxing and unboxing)
    jquery怎么跳出当前的each循环
    Integer与int的种种比较你知道多少
  • 原文地址:https://www.cnblogs.com/xuesen1995/p/4120745.html
Copyright © 2011-2022 走看看