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): 16093    Accepted Submission(s): 4216


    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
    地图如下:
    
    AC代码:(BFS+QUEUE)
    注意点:如果楼梯不能通行,考虑等待一秒的情况
      1 #include<iostream>
      2 #include<fstream>
      3 #include<queue>
      4 #include<string>
      5 using namespace std;
      6 const int MAX=25;
      7 struct pot
      8 {
      9     int x,y;
     10 };
     11 struct data
     12 {
     13     char zhi;
     14     int times;
     15 };    
     16 int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
     17 data arr[MAX][MAX];
     18 pot beg,end;
     19 int BFS_QUEUE()
     20 {
     21     queue<pot> que;
     22     pot cur,next;
     23     que.push(beg);
     24     arr[beg.x][beg.y].times=1;
     25     while(!que.empty())
     26     {
     27         cur=que.front();
     28         que.pop();
     29         for(int i=0;i<4;i++)
     30         {
     31             next.x=cur.x+dir[i][0]; next.y=cur.y+dir[i][1];
     32             if(arr[next.x][next.y].zhi=='*')//障碍跳过
     33                 continue;
     34             if(arr[next.x][next.y].zhi=='.')//过道
     35             {
     36                 if(arr[next.x][next.y].times==0||arr[next.x][next.y].times>arr[cur.x][cur.y].times+1)
     37                 {
     38                     arr[next.x][next.y].times=arr[cur.x][cur.y].times+1;
     39                     que.push(next);    
     40                 }
     41                 continue;
     42             }
     43             if(cur.x==next.x)//水平移动
     44             {
     45                 if((arr[next.x][next.y].zhi=='-'&&arr[cur.x][cur.y].times%2==1)
     46                     ||(arr[next.x][next.y].zhi=='|'&&arr[cur.x][cur.y].times%2==0))//横桥
     47                 {
     48                     next.y+=dir[i][1];
     49                     if(arr[next.x][next.y].zhi=='.'&&(arr[next.x][next.y].times==0||arr[next.x][next.y].times>arr[cur.x][cur.y].times+1))
     50                     {
     51                         arr[next.x][next.y].times=arr[cur.x][cur.y].times+1;
     52                         que.push(next);
     53                     }
     54                 }
     55                 else//竖桥,等待
     56                 {
     57                     int wait=1;//等一秒
     58                     next.y+=dir[i][1];
     59                     if(arr[next.x][next.y].zhi=='.'&&(arr[next.x][next.y].times==0||arr[next.x][next.y].times>arr[cur.x][cur.y].times+1+wait))
     60                     {
     61                         arr[next.x][next.y].times=arr[cur.x][cur.y].times+1+wait;
     62                         que.push(next);    
     63                     }
     64                 }
     65             }
     66             else//上下移动
     67             {
     68                 if((arr[next.x][next.y].zhi=='-'&&arr[cur.x][cur.y].times%2==0)||
     69                     (arr[next.x][next.y].zhi=='|'&&arr[cur.x][cur.y].times%2==1))//还是竖桥
     70                 {
     71                     next.x+=dir[i][0];
     72                     if(arr[next.x][next.y].zhi=='.'&&(arr[next.x][next.y].times==0||arr[next.x][next.y].times>arr[cur.x][cur.y].times+1))
     73                     {
     74                         arr[next.x][next.y].times=arr[cur.x][cur.y].times+1;
     75                         que.push(next);
     76                     }
     77                 }
     78                 else//横桥等待
     79                 {
     80                     int wait=1;//等一秒
     81                     next.x+=dir[i][0];
     82                     if(arr[next.x][next.y].zhi=='.'&&(arr[next.x][next.y].times==0||arr[next.x][next.y].times>arr[cur.x][cur.y].times+1+wait))
     83                     {
     84                         arr[next.x][next.y].times=arr[cur.x][cur.y].times+1+wait;
     85                         que.push(next);    
     86                     }
     87                 }
     88             }    
     89         }
     90     }
     91     return arr[end.x][end.y].times-1;    
     92 }
     93 int main()
     94 {
     95     //ifstream in("data.txt");
     96     int n,m;    
     97     while(cin>>n>>m&&n)
     98     {
     99         int i,j;
    100         for(i=1;i<=n;i++)
    101         {
    102             string s;cin>>s;
    103             for(j=1;j<=m;j++)
    104             {
    105                 arr[i][j].times=0;
    106                 arr[i][j].zhi=s[j-1];
    107                 if(s[j-1]=='S')//起点
    108                 {
    109                     beg.x=i;beg.y=j;
    110                     arr[i][j].zhi='.';
    111                 }
    112                 if(s[j-1]=='T')//终点
    113                 {
    114                     end.x=i;end.y=j;
    115                     arr[i][j].zhi='.';
    116                 }
    117             }
    118         }
    119         for(i=0;i<=n+1;i++)
    120         {
    121             arr[i][0].zhi='*';
    122             arr[i][m+1].zhi='*';
    123         }
    124         for(j=0;j<=m+1;j++)
    125         {
    126             arr[0][j].zhi='*';
    127             arr[n+1][j].zhi='*';
    128         }
    129         cout<<BFS_QUEUE()<<endl;
    130     }
    131     return 0;
    132 }
  • 相关阅读:
    士兵队列训练问题http://acm.hdu.edu.cn/showproblem.php?pid=1276
    Fence Repair http://poj.org/problem?id=3253
    A/B http://acm.hdu.edu.cn/showproblem.php?pid=1576
    房间安排http://acm.nyist.net/JudgeOnline/problem.php?pid=168
    Function Run Fun http://poj.org/problem?id=1579
    盗梦空间http://acm.nyist.net/JudgeOnline/problem.php?pid=125
    如何在Chrome中使用”并非来自Chrome网上应用店”的扩展程序
    C++中的函数指针模板
    C/C++中的源文件与头文件的区别
    C++同名函数的各种问题
  • 原文地址:https://www.cnblogs.com/zhaopeng938/p/7911567.html
Copyright © 2011-2022 走看看