MLE求助
查看原帖
MLE求助
649095
幻想繁星NM 猫猫可爱楼主2023/2/11 20:28
#include<bits/stdc++.h>
using namespace std;
inline int read();
int a[3003][3003];
bool v[3003][3003]; 
bool f[3003][3003];
struct kid{
	int i,j,t;
};
queue<kid>q;
map<int,bool>s,z;
int maxh,td=0x3f3f3f3f,tn=0x3f3f3f3f,ans=0x3f3f3f3f;
int main()
{
	int n=read(),m=read(),k=read();
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			a[i][j]=read();
			maxh=max(a[i][j],maxh);
		}
	while(k--)
	{
		int i=read(),j=read();
		f[i][j]=1;
	}
	q.push({1,1,0});
	while(!q.empty())
	{
		int i=q.front().i,j=q.front().j,t=q.front().t;
		v[i][j]=1;
		q.pop();
		if(i==n&&j==m)
		{
			ans=t;
			break;
		}
		if(i-1>0&&v[i-1][j]==0&&a[i-1][j]!=0)
			q.push({i-1,j,t+1});
		if(j-1>0&&v[i][j-1]==0&&a[i][j-1]!=0)
			q.push({i,j-1,t+1});
		if(i+1<=n&&v[i+1][j]==0&&a[i+1][j]!=0)
			q.push({i+1,j,t+1});
		if(j+1<=m&&v[i][j+1]==0&&a[i][j+1]!=0)
			q.push({i,j+1,t+1});
	}
	while(!q.empty())
		q.pop();
	q.push({1,1,0});
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			v[i][j]=0;
	while(!q.empty())
	{
		int i=q.front().i,j=q.front().j,t=q.front().t;
		v[i][j]=1;
		q.pop();
		if(t>td)
			break;
		if(f[i][j]==1)
		{
			s[a[i][j]]=1;
			td=t;
		}
		if(i-1>0&&v[i-1][j]==0&&a[i-1][j]!=0)
			q.push({i-1,j,t+1});
		if(j-1>0&&v[i][j-1]==0&&a[i][j-1]!=0)
			q.push({i,j-1,t+1});
		if(i+1<=n&&v[i+1][j]==0&&a[i+1][j]!=0)
			q.push({i+1,j,t+1});
		if(j+1<=m&&v[i][j+1]==0&&a[i][j+1]!=0)
			q.push({i,j+1,t+1});
	}
	while(!q.empty())
		q.pop();
	q.push({n,m,0});
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			v[i][j]=0;
	while(!q.empty())
	{
		int i=q.front().i,j=q.front().j,t=q.front().t;
		v[i][j]=1;
		q.pop();
		if(t>tn)
			break;
		if(f[i][j]==1)
		{
			z[a[i][j]]=1;
			tn=t;
		}
		if(i-1>0&&v[i-1][j]==0&&a[i-1][j]!=0)
			q.push({i-1,j,t+1});
		if(j-1>0&&v[i][j-1]==0&&a[i][j-1]!=0)
			q.push({i,j-1,t+1});
		if(i+1<=n&&v[i+1][j]==0&&a[i+1][j]!=0)
			q.push({i+1,j,t+1});
		if(j+1<=m&&v[i][j+1]==0&&a[i][j+1]!=0)
			q.push({i,j+1,t+1});
	}
	while(!q.empty())
		q.pop();
	if(td!=0x3f3f3f3f&&tn!=0x3f3f3f3f)
		for(int i=1;i<=maxh;i++)
		{
			if(s.count(i)&&z.count(i))
				break;
			if(i==maxh)
				td++;
		}
	if((td==0x3f3f3f3f||tn==0x3f3f3f3f)&&ans==0x3f3f3f3f)
		cout<<"-1";
	else if(td==0x3f3f3f3f||tn==0x3f3f3f3f)
		cout<<ans;
	else if(ans==0x3f3f3f3f)
		cout<<td+tn+1;
	else
		cout<<min(ans,td+tn+1);
	return 0;
}









inline int read()//整型快读函数 
{
	int f=1,x=0;
	char c=getchar();
	while(c<'0'||c>'9')
	{
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}
2023/2/11 20:28
加载中...