• hdu 1180诡异的楼梯(bfs)


    诡异的楼梯

    Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other)
    Total Submission(s) : 49   Accepted Submission(s) : 20

    Font: Times New Roman | Verdana | Georgia

    Font Size: ← →

    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

    Source

    Gardon-DYGG Contest 1

    #include <iostream>
    #include<cstdio>
    #include<queue>
    #include<cstring>
    using namespace std;
    int dr[4][2]={{1,0},{-1,0},{0,1},{0,-1} };// 楼梯方向设置对后面判断有影响
    struct node
    {
        int x,y,ti;
    };
    
    char mp[25][25];
    int ti[25][25];
    int n,m,i,j,sx,sy,tx,ty;
    
    int bfs()
    {
        node p;
        queue<node> s;
        p.x=sx;
        p.y=sy;
        p.ti=0;
        ti[sx][sy]=0;
        s.push(p);
        while(!s.empty())
        {
            node q=s.front();
            s.pop();
            for(int i=0;i<4;i++)
            {
                int xx=q.x+dr[i][0];
                int yy=q.y+dr[i][1];
                if (xx>=0 && xx<n && yy>=0 && yy<m && mp[xx][yy]!='*')
                {
                    p.ti=q.ti+1;
                  if(mp[xx][yy]=='|' || mp[xx][yy]=='-')   //关键
                  {
                      int xxx=xx+dr[i][0];
                      int yyy=yy+dr[i][1];
                      if(mp[xxx][yyy]=='*' || xxx<0 ||xxx>=n || yyy<0 || yyy>=m ) continue;
                      if(mp[xx][yy]=='|')
                       {
                           if(q.ti%2==1 && i<=1 || q.ti%2==0 && i>1) p.ti++;
                       } else
                      if (mp[xx][yy]=='-')
                          if(q.ti%2==1 && i>1 || q.ti%2==0 && i<=1) p.ti++;
                       xx=xxx;
                       yy=yyy;
    
                  }
                  if(p.ti<ti[xx][yy])
                      {
                          p.x=xx;
                          p.y=yy;
                          ti[xx][yy]=p.ti;
                          s.push(p);
                      }
                    if(xx==tx && yy==ty) return ti[xx][yy];
                }
            }
        }
    }
    int main()
    {
        while(~scanf("%d%d",&n,&m))
        {
            for(i=0;i<n;i++)
                {
                    scanf("%s",mp[i]);
                    for(j=0;j<m;j++)
                    {
                        if (mp[i][j]=='S') {sx=i,sy=j;mp[i][j]='.';}
                        if (mp[i][j]=='T') {tx=i,ty=j;mp[i][j]='.';}
                    }
                }
             memset(ti,10000,sizeof(ti));
             printf("%d\n",bfs());
        }
        return 0;
    }
  • 相关阅读:
    ACM ICPC 2008–2009 NEERC MSC A, B, C, G, L
    POJ 1088 滑雪 DP
    UVA 11584 最短回文串划分 DP
    POJ 2531 Network Saboteur DFS+剪枝
    UVa 10739 String to Palindrome 字符串dp
    UVa 11151 Longest Palindrome 字符串dp
    UVa 10154 Weights and Measures dp 降维
    UVa 10271 Chopsticks dp
    UVa 10617 Again Palindrome 字符串dp
    UVa 10651 Pebble Solitaire 状态压缩 dp
  • 原文地址:https://www.cnblogs.com/stepping/p/5667467.html
Copyright © 2020-2023  润新知