1 条题解

  • 1
    @ 2023-8-19 16:41:40
    #include <bits/stdc++.h> 
    using namespace std;
     
    const int Max=35;
    const int fx[5]={0,1,0,-1};
    const int fy[5]={1,0,-1,0};
    int n,m,q,head,tail,tot,ans;
    int num[Max][Max],dis[Max][Max][5],move[Max][Max][5][5];
    bool vis[Max][Max],v[Max][Max][5];
    int p[1000000][5],d[1000000][5];
     
    inline void bfs(int x,int y,int k1,int k2)
    {
    	int sx=x+fx[k1],sy=y+fy[k1],tx=x+fx[k2],ty=y+fy[k2];
    	if((!num[sx][sy])||(!num[tx][ty])) return;
    	head=0,tail=1;
    	p[1][1]=sx,p[1][2]=sy;
    	memset(vis,0,sizeof(vis));
    	vis[x][y]=vis[sx][sy]=1;
    	while(head<tail)
    	{
    	  head++;
    	  int xx=p[head][1],yy=p[head][2];
    	  for(int i=0;i<=3;i++)
    	  {
    	  	int x1=xx+fx[i],y1=yy+fy[i];
    	  	if(!vis[x1][y1] && num[x1][y1])
    	  	{
    		   vis[x1][y1]=1;
    	  	   p[++tail][1]=x1,p[tail][2]=y1,p[tail][0]=p[head][0]+1;
    	  	   if(x1==tx&&y1==ty) {move[x][y][k1][k2]=p[tail][0];return;}
    	  	}
    	  }
    	}
    }
     
    inline void pre()
    {
    	memset(move,43,sizeof(move));
    	for(int i=1;i<=n;i++)
    	  for(int j=1;j<=m;j++)
    	    if(num[i][j])
    	      for(int k=0;k<=3;k++)
    	        for(int l=0;l<=3;l++)
    	          if(l==k) move[i][j][k][l]=0;
    	          else bfs(i,j,k,l);
    }
     
    inline void calc(int x,int y,int sx,int sy)
    {
    	head=0,tail=1,tot=0;
    	p[1][1]=x,p[1][2]=y,p[1][0]=0;
    	memset(vis,0,sizeof(vis));
    	vis[x][y]=vis[sx][sy]=1;
    	while(head<tail)
    	{
    	  head++;
    	  int xx=p[head][1],yy=p[head][2];
    	  for(int i=0;i<=3;i++)
    	  {
    	  	int x1=xx+fx[i],y1=yy+fy[i];
    	  	if(num[x1][y1]&&!vis[x1][y1])
    	  	{
    	  	  vis[x1][y1]=1;
    	  	  p[++tail][0]=p[head][0]+1;
    	  	  p[tail][1]=x1,p[tail][2]=y1;
    	  	}
    	  	else if(x1==sx&&y1==sy) d[++tot][1]=x1,d[tot][2]=y1,d[tot][0]=p[head][0],d[tot][3]=(i+2)%4;
    	  }
    	}
    }
     
    inline void SPFA()
    {
    	memset(v,0,sizeof(v));
    	for(int i=1;i<=tot;i++) dis[d[i][1]][d[i][2]][d[i][3]]=d[i][0],v[d[i][1]][d[i][2]][d[i][3]]=1;
    	head=0,tail=tot;
    	while(head<tail)
    	{
    	  head++;
    	  int x=d[head][1],y=d[head][2];
    	  v[x][y][d[head][3]]=0;
    	  for(int i=0;i<=3;i++)
    	  {
    	  	int x1=x+fx[i],y1=y+fy[i];
    	  	if(dis[x1][y1][(i+2)%4] > dis[x][y][d[head][3]]+move[x][y][d[head][3]][i]+1)
    	  	{
    		  dis[x1][y1][(i+2)%4]=dis[x][y][d[head][3]]+move[x][y][d[head][3]][i]+1;
    		  if(!v[x1][y1][(i+2)%4])
    		  {
    		  	tail++;
    		  	d[tail][1]=x1,d[tail][2]=y1,d[tail][3]=(i+2)%4;
    		  	v[x1][y1][(i+2)%4]=1;
    		  }
    		} 
    	  }
    	}
    }
     
    int main()
    {
    	scanf("%d%d%d",&n,&m,&q);
    	for(int i=1;i<=n;i++)
    	  for(int j=1;j<=m;j++) scanf("%d",&num[i][j]);
    	pre();
    	while(q--)
    	{
    	  int x,y,sx,sy,tx,ty;
    	  scanf("%d%d%d%d%d%d",&x,&y,&sx,&sy,&tx,&ty);
    	  if(sx==tx&&sy==ty) {cout<<"0\n";continue;}
    	  memset(dis,43,sizeof(dis));
    	  calc(x,y,sx,sy);
    	  SPFA();
    	  ans=dis[0][0][0];
    	  for(int i=0;i<=3;i++) ans=min(ans,dis[tx][ty][i]);
    	  if(ans==dis[0][0][0]) cout<<"-1\n";
    	  else cout<<ans<<"\n";
    	}
    	return 0;
    }
     
     
    
    
    • 1

    信息

    ID
    1479
    时间
    1000ms
    内存
    128MiB
    难度
    8
    标签
    递交数
    16
    已通过
    8
    上传者