50分求助
查看原帖
50分求助
817055
_KUK_楼主2024/1/10 21:49

代码

#include<iostream>
#include<queue>
using namespace std;
queue<int>q1,q2,q3;
bool vis[10][55][55];
bool a[55][55];
int dis[10][55][55],n,m,qidianx,qidiany,zhongdianx,zhongdiany,fang;
int bfs()
{
   q1.push(qidianx);
   q2.push(qidiany);
   q3.push(fang);
   vis[fang][qidianx][qidiany]=1;
   while(!q1.empty())
   {
       int x,y,f;
       x=q1.front();
       y=q2.front();
       f=q3.front();
       q1.pop();
       q2.pop();
       q3.pop();
       if(x==zhongdianx&&y==zhongdiany)
       {
           return dis[f][x][y];
       }
       int xx,yy,fx;
       fx=f+1;
       xx=x;
       yy=y;
       if(fx>4)fx=1;
       if(!vis[fx][xx][yy])
       {
           vis[fx][xx][yy]=1;
           dis[fx][xx][yy]=dis[f][x][y]+1;
           q1.push(xx);
           q2.push(yy);
           q3.push(fx);
       }
       fx=f-1;
       xx=x;
       yy=y;
       if(fx<1)fx=4;
       if(!vis[fx][xx][yy])
       {
           vis[fx][xx][yy]=1;
           dis[fx][xx][yy]=dis[f][x][y]+1;
           q1.push(xx);
           q2.push(yy);
           q3.push(fx);
       }
       if(f==1)
       {
           xx=x-1;
           yy=y;
           if(a[xx][yy]==0&&xx>=1&&yy>=1&&xx<=n-1&&yy<=m-1&&vis[f][xx][yy]==0)
           {
               vis[f][xx][yy]=1;
               dis[f][xx][yy]=dis[f][x][y]+1;
               q1.push(xx);
               q2.push(yy);
               q3.push(f);
           }
           xx=x-2;
           yy=y;
           if(a[xx][yy]==0&&a[xx+1][yy]==0&&xx>=1&&yy>=1&&xx<=n-1&&yy<=m-1&&vis[f][xx][yy]==0)
           {
               vis[f][xx][yy]=1;
               dis[f][xx][yy]=dis[f][x][y]+1;
               q1.push(xx);
               q2.push(yy);
               q3.push(f);
           }
           xx=x-3;
           yy=y;
           if(a[xx][yy]==0&&a[xx+1][yy]==0
           &&a[xx+2][yy]==0&&xx>=1&&yy>=1&&xx<=n-1&&yy<=m-1&&vis[f][xx][yy]==0)
           {
               vis[f][xx][yy]=1;
               dis[f][xx][yy]=dis[f][x][y]+1;
               q1.push(xx);
               q2.push(yy);
               q3.push(f);
           }
       }
       if(f==2)
       {
           xx=x;
           yy=y+1;
           if(a[xx][yy]==0&&xx>=1&&yy>=1&&xx<=n-1&&yy<=m-1&&vis[f][xx][yy]==0)
           {
               vis[f][xx][yy]=1;
               dis[f][xx][yy]=dis[f][x][y]+1;
               q1.push(xx);
               q2.push(yy);
               q3.push(f);
           }
           xx=x;
           yy=y+2;
           if(a[xx][yy]==0&&a[xx][yy-1]==0&&xx>=1&&yy>=1&&xx<=n-1&&yy<=m-1&&vis[f][xx][yy]==0)
           {
               vis[f][xx][yy]=1;
               dis[f][xx][yy]=dis[f][x][y]+1;
               q1.push(xx);
               q2.push(yy);
               q3.push(f);
           }
           xx=x;
           yy=y+3;
           if(a[xx][yy]==0&&a[xx][yy-1]==0
           &&a[xx][yy-2]==0&&xx>=1&&yy>=1&&xx<=n-1&&yy<=m-1&&vis[f][xx][yy]==0)
           {
               vis[f][xx][yy]=1;
               dis[f][xx][yy]=dis[f][x][y]+1;
               q1.push(xx);
               q2.push(yy);
               q3.push(f);
           }
       }
       if(f==3)
       {
           xx=x+1;
           yy=y;
           if(a[xx][yy]==0&&xx>=1&&yy>=1&&xx<=n-1&&yy<=m-1&&vis[f][xx][yy]==0)
           {
               vis[f][xx][yy]=1;
               dis[f][xx][yy]=dis[f][x][y]+1;
               q1.push(xx);
               q2.push(yy);
               q3.push(f);
           }
           xx=x+2;
           yy=y;
           if(a[xx][yy]==0&&a[xx-1][yy]==0&&xx>=1&&yy>=1&&xx<=n-1&&yy<=m-1&&vis[f][xx][yy]==0)
           {
               vis[f][xx][yy]=1;
               dis[f][xx][yy]=dis[f][x][y]+1;
               q1.push(xx);
               q2.push(yy);
               q3.push(f);
           }
           xx=x+3;
           yy=y;
           if(a[xx][yy]==0&&a[xx-1][yy]==0
           &&a[xx-2][yy]==0&&xx>=1&&yy>=1&&xx<=n-1&&yy<=m-1&&vis[f][xx][yy]==0)
           {
               vis[f][xx][yy]=1;
               dis[f][xx][yy]=dis[f][x][y]+1;
               q1.push(xx);
               q2.push(yy);
               q3.push(f);
           }
       }
       if(f==4)
       {
           xx=x;
           yy=y-1;
           if(a[xx][yy]==0&&xx>=1&&yy>=1&&xx<=n-1&&yy<=m-1&&vis[f][xx][yy]==0)
           {
               vis[f][xx][yy]=1;
               dis[f][xx][yy]=dis[f][x][y]+1;
               q1.push(xx);
               q2.push(yy);
               q3.push(f);
           }
           xx=x;
           yy=y-2;
           if(a[xx][yy]==0&&a[xx][yy+1]==0&&xx>=1&&yy>=1&&xx<=n-1&&yy<=m-1&&vis[f][xx][yy]==0)
           {
               vis[f][xx][yy]=1;
               dis[f][xx][yy]=dis[f][x][y]+1;
               q1.push(xx);
               q2.push(yy);
               q3.push(f);
           }
           xx=x;
           yy=y-3;
           if(a[xx][yy]==0&&a[xx][yy+1]==0
           &&a[xx][yy+2]==0&&xx>=1&&yy>=1&&xx<=n-1&&yy<=m-1&&vis[f][xx][yy]==0)
           {
               vis[f][xx][yy]=1;
               dis[f][xx][yy]=dis[f][x][y]+1;
               q1.push(xx);
               q2.push(yy);
               q3.push(f);
           }
       }
   }
   return -1;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            int k;
            cin>>k;
            if(k==1)
            {
                a[i-1][j-1]=1;
                a[i-1][j]=1;
                a[i][j-1]=1;
                a[i][j]=1;
            }
        }
    }
    n--;
    m--;
    cin>>qidianx>>qidiany>>zhongdianx>>zhongdiany>>fang;
    if(fang=='N')fang=4;
    else if(fang=='S')fang=2;
    else if(fang=='E')fang=3;
    else if(fang=='W')fang=1;
    cout<<bfs()<<endl;
    return 0;
}
2024/1/10 21:49
加载中...