求助! RE 了好多(每次RE的点还不一样)
查看原帖
求助! RE 了好多(每次RE的点还不一样)
345003
31415926P楼主2021/11/19 19:41
#include<bits/stdc++.h>
using namespace std;
int m,n,X,Y,FX,FY;
#define M 100000
long long way[40][40],f[40][40],s[40][40],lian[40][40];
int d1[9]={-100,1,1,-1,-1,2,2,-2,-2};
int d2[9]={-233,2,-2,2,-2,1,-1,1,-1};
long long First[M],Next[M],to[M],w[M],tot,ji[40][40],a[40][40];
inline void add(int x,int y,int z)
{
	tot++;
	Next[tot]=First[x];
	First[x]=tot;
	to[tot]=y;
	w[tot]=z;
}
map<int,int> XX;
map<int,int> YY;
queue<int> d;
void spfa()
{
	while(!d.empty())
	{
		int x=d.front();
		d.pop();
		int xx1=XX[x],yy1=YY[x];
		f[xx1][yy1]=0;
		for(int i=First[x];i;i=Next[i])
		{
			int lmh=to[i];
			int xx2=XX[lmh],yy2=YY[lmh];
			if(lian[xx2][yy2]>lian[xx1][yy1]+w[i])
			{
				lian[xx2][yy2]=lian[xx1][yy1]+w[i];
				way[xx2][yy2]=way[xx1][yy1];
				if(!f[xx2][yy2])
				{
					f[xx2][yy2]=1;
					d.push(lmh);
				}
				continue;
			}
			if(lian[xx2][yy2]==lian[xx1][yy1]+w[i])
			{
				way[xx2][yy2]+=way[xx1][yy1];
				if(!f[xx2][yy2])
				{
					f[xx2][yy2]=1;
					d.push(lmh);
				}
			}
		}
	}
}
int v[40][40];
inline void dfs(int CNT,int x,int y)
{
	if((a[x][y]==0||a[x][y]==4||a[x][y]==3)&&CNT!=ji[x][y])
	{
		add(CNT,ji[x][y],1);
		return;
	}
	for(int df=1;df<=8;df++)
	{
		if(x+d1[df]>=1&&x+d1[df]<=n&&y+d2[df]>=1&&y+d2[df]<=m&&v[x+d1[df]][y+d2[df]]==0)
		{
			v[x+d1[df]][y+d2[df]]=1;
			if(a[x+d1[df]][y+d2[df]]==2)continue;
			dfs(CNT,x+d1[df],y+d2[df]);
			v[x+d1[df]][y+d2[df]]=0;
		}
	}
			
}
int main()
{
	cin>>n>>m;
	int cnt=0,cntt=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cntt++;
			XX[cntt]=i;
			YY[cntt]=j;
			ji[i][j]=cntt;
			cin>>a[i][j];
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cnt++;
//			
//			if(a[i][j]==1||a[i][j]==4||a[i][j]==3)
//			{
				if(a[i][j]==3)
				{
					X=i,Y=j;
				}
				if(a[i][j]==4)FX=i,FY=j;
				memset(v,0,sizeof(v));									
				v[i][j]=1;	
				dfs(cnt,i,j);		
		}
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			lian[i][j]=s[i][j]=21474836;
	way[X][Y]=1;		
	s[X][Y]=0;
	lian[X][Y]=0;
	d.push(ji[X][Y]);
	spfa();
//	for(int i=1;i<=n;i++){
//	
//		for(int j=1;j<=m;j++)
//		{
//			cout<<way[i][j]<<" ";
//		}
//			
//		cout<<endl;}
	if(way[FX][FY])
	{
		cout<<lian[FX][FY]-1<<endl<<way[FX][FY];
		return 0;
	}
	cout<<-1;
}

2021/11/19 19:41
加载中...