80求条
查看原帖
80求条
1089037
Paper27楼主2024/7/25 19:23
#include <bits/stdc++.h>
using namespace std;
int xd[4]={1,-1,0,0},yd[4]={0,0,1,-1};
int dy[4]={1,0,3,2};
int f[42][42][4][4];
int ff[42][42][4];
int a[42][42];
int n,m,qk;
int h,e;
struct node
{
	int x,y,d;
}q[1000];
bool fy[42][42];
bool ch(int x,int y)
{
	return x>0&&y>0&&x<=n&&y<=m&&a[x][y];
}
int bfs(int sx,int sy,int ex,int ey)
{
	memset(fy,false,sizeof(fy));
	h=0;
	e=-1;
	q[++e]={sx,sy,0};
	fy[sx][sy]=true;
	while(h<=e)
	{
		node u=q[h++];
		for(int i=0;i<4;i++)
		{
			int lx=u.x+xd[i],ly=u.y+yd[i];
			if(!ch(lx,ly)||fy[lx][ly])continue;
			if(lx==ex&&ly==ey)return u.d+1;
			q[++e]={lx,ly,u.d+1};
			fy[lx][ly]=true;
		}
	}
	return 0x3f3f3f3f;
}
struct nod
{
	int x,y,e,d;
	friend bool operator < (nod a,nod b)
	{
		return a.d>b.d;
	}
};
priority_queue<nod>qp;
bool ft[42][42][4];
int dij(int sx,int sy,int ex,int ey)
{
	while(!qp.empty())qp.pop();
	memset(ft,false,sizeof(ft));
	for(int i=0;i<4;i++)qp.push({sx,sy,i,ff[sx][sy][i]});
	while(!qp.empty())
	{
		nod u=qp.top();
		//cout<<u.x<<" "<<u.y<<" "<<u.e<<" "<<u.d<<"|\n";
		qp.pop();
		if(u.x==ex&&u.y==ey)return u.d;
		if(ft[u.x][u.y][u.e])continue;
		ft[u.x][u.y][u.e]=true;
		int lx=u.x+xd[u.e],ly=u.y+yd[u.e];
		int e=dy[u.e];
		if(!ch(lx,ly))continue;
		for(int i=0;i<4;i++)
		{
			if(f[lx][ly][e][i]==0x3f3f3f3f)continue;
			int w=u.d+1+f[lx][ly][e][i];
			if(w<ff[lx][ly][i])
			{
				ff[lx][ly][i]=w;
				qp.push({lx,ly,i,w});
			}
		}
	}
	return -1;
}
int main()
{
	cin>>n>>m>>qk;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			scanf("%d",&a[i][j]);
		}
	}
	memset(f,0x3f,sizeof(f));
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(!ch(i,j))continue;
			a[i][j]=0;
			for(int ii=0;ii<4;ii++)
			{
				f[i][j][ii][ii]=0;
				for(int jj=0;jj<4;jj++)
				{
					if(ii==jj)continue;
					int sx=i+xd[ii],sy=j+yd[ii];
					int ex=i+xd[jj],ey=j+yd[jj];
					if(!ch(sx,sy)||!ch(ex,ey))continue;
					f[i][j][ii][jj]=bfs(sx,sy,ex,ey);
					//printf("i:%d j:%d ii:%d jj:%d by:%d\n",i,j,ii,jj,f[i][j][ii][jj]);
				}
			}
			a[i][j]=1;
		}
	}
	while(qk--)
	{
		int ex,ey,sx,sy,tx,ty;
		scanf("%d%d%d%d%d%d",&ex,&ey,&sx,&sy,&tx,&ty);
		if(!ch(ex,ey)||!ch(sx,sy)||!ch(tx,ty))
		{
			cout<<-1<<endl;
			continue;
		}
		if(sx==tx&&sy==ty)
		{
			cout<<0<<endl;
			continue;
		}
		memset(ff,0x3f,sizeof(ff));
		a[sx][sy]=0;
		for(int i=0;i<4;i++)
		{
			int lx=sx+xd[i],ly=sy+yd[i];
			if(!ch(lx,ly))continue;
			ff[sx][sy][i]=bfs(ex,ey,lx,ly);
			//cout<<i<<"|"<<ff[sx][sy][i]<<" ";
		}
		a[sx][sy]=1;
		printf("%d\n",dij(sx,sy,tx,ty));
	}
	return 0;
}
2024/7/25 19:23
加载中...