65pts求调
查看原帖
65pts求调
345190
cyalbe楼主2021/3/31 18:35
#include<cstdio>
#include<algorithm>
using namespace std;
int mg[1005][1005],l1=0,l2=0,f[1005],a[1005][1005];
int c1,c2,g1,g2,g3,g4,g5,g6,g7,g8;
int x1,y1,x2,y2,x3,y3,x4,y4;
int main()
{
	//freopen("pacman.in","r",stdin);
    //freopen("pacman.out","w",stdout);
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			scanf("%d",&mg[i][j]);
		}
	}
	for(int i=1;i<=n;i++)
	{
		l1+=mg[i][i];
		l2+=mg[i][n+1-i];
	} 
	f[1]=l1;
	f[n]=l2; 
	for(int k=2;k<n;k++)//k表示矩形在最左边的边上的点的纵坐标 
	{
		for(int i=1;i<=n;i++)
		{
			f[k]+=mg[i][k+1-i];//左上边 
		}
		for(int i=1;i<=n+1-k;i++)
		{
			f[k]+=mg[k-1+i][i];//右上边 
		}
		for(int i=1;i<=k;i++)
		{
			f[k]+=mg[n-k+i][n+1-i];//右下边 
		}
		for(int i=1;i<=n+1-k;i++)
		{
			f[k]+=mg[i][k-1+i];//左下边 
		}
		f[k]=f[k]-mg[1][k]-mg[k][1]-mg[n+1-k][n]-mg[n][n+1-k];
	} 
	int maxn=0;
	for(int k=1;k<n;k++)
	{
		for(int c=k+1;c<=n;c++)// k和c表示两个不同矩形矩形在最左边的边上的点的纵坐标 
		{
			int sum=f[k]+f[c];
			int t;
			if((k+c)%2==0&&(c-k)%2==0)
			{
				x1=(c-k)/2+1;//对称求重复的点 
				y1=(k+c)/2;
				x2=(k+c)/2;//y1
				y2=(c-k)/2+1;//x1
				x3=n-(k+c)/2+1;
				y3=n-(c-k)/2; 
				x4=n-(c-k)/2;
				y4=n-(k+c)/2+1;
				if(k!=1&&c!=n)//矩形 
				{
					if(sum-mg[x1][y1]-mg[x2][y2]-mg[x3][y3]-mg[x4][y4]>maxn)
					{
						maxn=sum-mg[x1][y1]-mg[x2][y2]-mg[x3][y3]-mg[x4][y4];
					}
				}
				else if(k==1&&c==n)//对角线 
				{
					if(sum-mg[x1][y1]>maxn)
					{
						maxn=sum-mg[x1][y1];
					}
				}
				else //矩形+对角线 
				{
					if(x1==x2)
					{
						if(sum-mg[x1][y1]-mg[x3][y3]>maxn)
						{
							maxn=sum-mg[x1][y1]-mg[x3][y3];
						}
					}	
					else
					{
						if(sum-mg[x2][y2]-mg[x3][y3]>maxn)
						{
							maxn=sum-mg[x2][y2]-mg[x3][y3];
						}
					}
				}
			}
			else
			{
				if(sum>maxn)
				{
					maxn=sum;
				}
			}
		}
	}
	printf("%d",maxn);
	return 0;
}
2021/3/31 18:35
加载中...