(BFS)codeforces #Round354-div2-D

来源:互联网 发布:中国移动网络测速 编辑:程序博客网 时间:2024/04/29 15:03

题目链接:题目链接


题意:一个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\n",bfs());}


0 0