zoukankan      html  css  js  c++  java
  • HDU 1180 诡异的楼梯(BFS)

    诡异的楼梯

    Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u

    Submit Status

    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....

    题目简单翻译:

    解题思路:

    BFS,注意可以原地停留。

    代码:

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<vector>
    #include<queue>
    #include<map>
    using namespace std;
    struct node
    {
        int x,y;
        int dis;
    };
    struct Point
    {
        int x,y;
    };
    queue<node> Q;
    char mp[25][25];
    int fff[25][25];
    int n,m;
    vector<Point> V;
    int dx[]={0,0,1,-1};
    int dy[]={1,-1,0,0};
    int vis[25][25];
    int sx,sy,ex,ey;
    bool check(int x,int y)
    {
        return x>=0&&x<n&&y>=0&&y<m;
    }
    
    void bfs()
    {
        memset(vis,0,sizeof vis);
        while(!Q.empty()) Q.pop();
        int w=0;
        node st;
        st.x=sx,st.y=sy;
        st.dis=0;
        Q.push(st);
        vis[sx][sy]=1;
        while(!Q.empty())
        {
    
            node e=Q.front();
            Q.pop();
    //        printf("e.x= %d  e.y= %d  e.dis= %d 
    ",e.x,e.y,e.dis);
            if(e.x==ex&&e.y==ey)
            {
                printf("%d
    ",e.dis);
                return;
            }
            while(e.dis>w)
            {
                w++;
                for(int i=0;i<V.size();i++)
                    fff[V[i].x][V[i].y]^=1;
            }
            for(int i=0;i<4;i++)
            {
                int curx=e.x+dx[i];
                int cury=e.y+dy[i];
                if(check(curx,cury)&&vis[curx][cury]==0&&mp[curx][cury]!='*')
                {
                    if(mp[curx][cury]=='@')
                    {
                        if(((i==0||i==1)&&fff[curx][cury]==1)||((i==2||i==3)&&fff[curx][cury]==0))
                        {
                            curx+=dx[i];
                            cury+=dy[i];
                        }
                        else
                        {
                            if(((i==0||i==1)&&fff[curx][cury]==0)||((i==2||i==3)&&fff[curx][cury]==1))
                            {
                                node e1=e;
                                e1.dis+=1;
                                Q.push(e1);
                            }
                            continue;
                        }
                    }
                    if(check(curx,cury)&&vis[curx][cury]==0&&mp[curx][cury]!='*')
                    {
                        node e1;
                        e1.x=curx;
                        e1.y=cury;
                        vis[curx][cury]=1;
                        e1.dis=e.dis+1;
                        Q.push(e1);
                    }
                }
            }
        }
    }
    int main()
    {
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            memset(fff,-1,sizeof fff);
            V.clear();
            for(int i=0;i<n;i++)
            {
                scanf("%s",mp[i]);
                for(int j=0;j<m;j++)
                {
                    if(mp[i][j]=='S') sx=i,sy=j;
                    if(mp[i][j]=='T') ex=i,ey=j;
                    if(mp[i][j]=='|')
                    {
                            mp[i][j]='@';
                            Point e;
                            e.x=i;
                            e.y=j;
                            fff[i][j]=0;
                            V.push_back(e);
                    }
                    if(mp[i][j]=='-')
                    {
                        mp[i][j]='@';
                        Point e;
                        e.x=i;
                        e.y=j;
                        fff[i][j]=1;
                        V.push_back(e);
                    }
                }
            }
            bfs();
        }
        return 0;
    }
    /*
    5 5
    **..T
    **.*.
    ..*..
    .*.*.
    S....
    5 5
    **..T
    **.*.
    ..|..
    .*.*.
    S....
    5 5
    **..T
    **.*.
    ..-..
    .*.*.
    S....
    5 5
    **..T
    **.*.
    *.-..
    .*.*.
    S....
    
    
    
    
    
    
    9 10
    *****.....
    .......*..
    .......*..
    *.******.*
    *.******.*
    *.******.*
    .......*..
    ......S|T.
    .......*..
    
    
    
    
    
    
    
    
    
    */
  • 相关阅读:
    14_java之变量|参数|返回值|修饰符
    NYOJ 202 红黑树 (二叉树)
    NYOJ 138 找球号(二) (哈希)
    NYOJ 136 等式 (哈希)
    NYOJ 133 子序列 (离散化)
    NYOJ 129 树的判定 (并查集)
    NYOJ 117 求逆序数 (树状数组)
    NYOJ 93 汉诺塔 (数学)
    HDU 2050 折线分割平面 (数学)
    天梯赛L2-008 最长对称子串 (字符串处理)
  • 原文地址:https://www.cnblogs.com/I-love-HLD/p/4625386.html
Copyright © 2011-2022 走看看