dfs 95分求助
查看原帖
dfs 95分求助
311932
bystander_silent楼主2021/4/11 09:48
#include<bits/stdc++.h>
using namespace std;
int a[1005][1005];
int n;
int ans;
int dfs(int csx,int csy,int x,int y,int fx,int flag/*这个点是否为起始点*/,int sz/*0是顺时针,1是逆时针*/,int wc)//1为左上,2为右上,3为右下,4为左下 
{
	if(x==csx && y==csy && flag)
		return ans;
	if((x==n && y==n) || (x==n && y==1))
	{
		ans+=a[x][y];
		return ans;
	}
	if(wc)
		a[x][y]=0;
	else
		ans+=a[x][y];
	if(fx==1)
		x-=1,y-=1;
	if(fx==2)
		y+=1,x-=1;
	if(fx==3)
		x+=1,y+=1;
	if(fx==4)
		y-=1,x+=1;
	if((x==n || y==n || (x==1 && y!=1) || (y==1 && x!=1)) && flag)
	{
		if(!(sz))
		{
			fx=1+fx;
			if(fx==5)
				fx=1;
		}
		else
		{
			fx=fx-1;
			if(fx==0)
				fx=4;
		}
	}
	dfs(csx,csy,x,y,fx,1,sz,wc);
	return ans;
}

struct node {
	int q;
	int bh;
	int fx;
	int sz;
}w[1000];

bool cmp(node f,node g)
{
	return f.q>g.q;
}

int main()
{ 
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			scanf("%d",&a[i][j]);
	if(n==2)
	{
		cout<<a[1][1]+a[1][2]+a[2][1]+a[2][2];
		return 0;
	}
	if(n==3)
	{
		int s=a[1][1]+a[2][2]+a[3][3],s2=a[1][3]+a[2][2]+a[3][1],s3=a[2][1]+a[1][2]+a[2][3]+a[3][2];
		if(s>s2)
		{
			s2-=a[2][2];
			if(s2>s3)
				cout<<s+s2;
			else
				cout<<s+s3;
		}
		else
		{
			s-=a[2][2];
			if(s>s3)
				cout<<s+s2;
			else
				cout<<s2+s3;
		}
		return 0;
	}
	for(int i=1;i<=n/2;i++)
	{
		ans=0;
		w[i].q=dfs(1,i,1,i,3,0,0,0);
		w[i].bh=i;
		w[i].fx=3;
		w[i].sz=0;
	}
	for(int i=n/2+1;i<=n;i++)
	{
		ans=0;
		w[i].q=dfs(1,i,1,i,4,0,1,0);
		w[i].bh=i;
		w[i].fx=4;
		w[i].sz=1;
	}	
	sort(w+1,w+n+1,cmp);
	long long sum=w[1].q;
	
	
	int e=dfs(1,w[1].bh,1,w[1].bh,w[1].fx,0,w[1].sz,1);
	memset(w,0,sizeof(w));
	for(int i=1;i<=n/2;i++)
	{
		ans=0;
		w[i].q=dfs(1,i,1,i,3,0,0,0);
		w[i].bh=i;
		w[i].fx=3;
		w[i].sz=0;
	}
	for(int i=n/2+1;i<=n;i++)
	{
		ans=0;
		w[i].q=dfs(1,i,1,i,4,0,1,0);
		w[i].bh=i;
		w[i].fx=4;
		w[i].sz=1;
	}	
	sort(w+1,w+n+1,cmp);
	sum+=w[1].q;
	printf("%lld",sum);
	return 0;
}
2021/4/11 09:48
加载中...