zoukankan      html  css  js  c++  java
  • codeforces #Round354-div2-D(BFS)

    题目链接:题目链接


    题意:一个n*m的区域,每个格子都有上下左右四个门,相邻的两个格子A可以通向B当且仅当A对B的门和B对A的门都打开,问从起点S到终点T需要的最短时间


    #include<bits/stdc++.h>
    using namespace std;
    const int N=1003;
    int n,m;
    int sx,sy,tx,ty;
    int dirx[]={1,-1,0,0};
    int diry[]={0,0,1,-1};
    char matrix[N][N];
    bool visit[N][N][4];
    char rotat[6][15]={{"+-|^><vLRUD*"},{"+|->v^<UDRL*"},{"+-|v<>^RLDU*"},{"+|-<^v>DULR*"}};
    class node
    {
        public:
        int x;
        int y;
        int angle;
        int step;
        public:
        node(int x,int y,int a,int s):x(x),y(y),angle(a),step(s){}
    };
    int number(char c)
    {
        if(c=='+') return 0;
        if(c=='-') return 1;
        if(c=='|') return 2;
        if(c=='^') return 3;
        if(c=='>') return 4;
        if(c=='<') return 5;
        if(c=='v') return 6;
        if(c=='L') return 7;
        if(c=='R') return 8;
        if(c=='U') return 9;
        if(c=='D') return 10;
        if(c=='*') return 11;
    }
    bool yestop(char c)
    {
        if(c=='+'||c=='|'||c=='^'||c=='L'||c=='R'||c=='D')
        return 1;
        return 0;
    }
    bool yesbottom(char c)
    {
        if(c=='+'||c=='|'||c=='v'||c=='L'||c=='R'||c=='U')
        return 1;
        return 0;
    }
    bool yesleft(char c)
    {
        if(c=='+'||c=='-'||c=='<'||c=='R'||c=='U'||c=='D')
        return 1;
        return 0;
    }
    bool yesright(char c)
    {
        if(c=='+'||c=='-'||c=='>'||c=='L'||c=='U'||c=='D')
        return 1;
        return 0;
    }
    bool in(int x,int y)
    {
        if(x<=0||x>n||y<=0||y>m)
        return 0;
        return 1;
    }
    queue<node> Q;
    int bfs()
    {
        Q.push(node(sx,sy,0,0));
        visit[sx][sy][0]=1;
        while(!Q.empty())
        {
            node p=Q.front();
            Q.pop();
            if(p.x==tx&&p.y==ty)
            return p.step;
            for(int i=0;i<4;i++)
            {
                int nx=p.x+dirx[i];
                int ny=p.y+diry[i];
                switch(i)
                {
                    case 0:
                        if(in(nx,ny)&&!visit[nx][ny][p.angle]&&yesbottom(rotat[p.angle][number(matrix[p.x][p.y])])
                           &&yestop(rotat[p.angle][number(matrix[nx][ny])]))
                           {
                               Q.push(node(nx,ny,p.angle,p.step+1));
                               visit[nx][ny][p.angle]=1;
                           }
                           break;
                    case 1:
                        if(in(nx,ny)&&!visit[nx][ny][p.angle]&&yestop(rotat[p.angle][number(matrix[p.x][p.y])])
                           &&yesbottom(rotat[p.angle][number(matrix[nx][ny])]))
                           {
                               Q.push(node(nx,ny,p.angle,p.step+1));
                               visit[nx][ny][p.angle]=1;
                           }
                           break;
                    case 2:
                        if(in(nx,ny)&&!visit[nx][ny][p.angle]&&yesright(rotat[p.angle][number(matrix[p.x][p.y])])
                           &&yesleft(rotat[p.angle][number(matrix[nx][ny])]))
                           {
                               Q.push(node(nx,ny,p.angle,p.step+1));
                               visit[nx][ny][p.angle]=1;
                           }
                           break;
                    case 3:
                        if(in(nx,ny)&&!visit[nx][ny][p.angle]&&yesleft(rotat[p.angle][number(matrix[p.x][p.y])])
                           &&yesright(rotat[p.angle][number(matrix[nx][ny])]))
                           {
                               Q.push(node(nx,ny,p.angle,p.step+1));
                               visit[nx][ny][p.angle]=1;
                           }
                           break;
                }
            }
            p.angle=(p.angle+1)%4;
            if(!visit[p.x][p.y][p.angle])
            {
                p.step++;
                Q.push(node(p));
                visit[p.x][p.y][p.angle]=1;
            }
        }
        return -1;
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        scanf("%s",matrix[i]+1);
        scanf("%d%d",&sx,&sy);
        scanf("%d%d",&tx,&ty);
        printf("%d
    ",bfs());
    }
    



  • 相关阅读:
    auto_ptr解析
    C++ auto_ptr智能指针的用法
    C++ 默认构造函数
    phpdisk 盲注 &前台任意用户登录
    冒泡排序
    关于C++中的友元函数的总结
    python中的闭包
    reverse Polish notation
    PostScript
    sqlite
  • 原文地址:https://www.cnblogs.com/westwind1005/p/5975232.html
Copyright © 2011-2022 走看看