P1406 40分求助
  • 板块P1406 方格填数
  • 楼主hewo
  • 当前回复6
  • 已保存回复6
  • 发布时间2020/8/2 16:20
  • 上次更新2023/11/6 21:30:04
查看原帖
P1406 40分求助
64976
hewo楼主2020/8/2 16:20

rt,只对了前两个点;

#include<bits/stdc++.h>
//#include<windows.h>
using namespace std;
int m[100][100],a[100];
bool used[100];
int n,esum;
int hang()
{
	int sum[10];
	memset(sum,0,sizeof(sum));
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			sum[i]+=m[i][j];
		}
	}
	for(int i=2;i<=n;i++)
	{
		if(sum[i]!=sum[i-1]) return 0x7f-1;
	}
	return sum[1];
}
int lie()
{
	int sum[10];
	memset(sum,0,sizeof(sum));
	for(int j=1;j<=n;j++)
	{
		for(int i=1;i<=n;i++)
		{
			sum[j]+=m[i][j];
		}
	}
	for(int i=2;i<=n;i++)
	{
		if(sum[i]!=sum[i-1]) return 0x7f;
	}
	return sum[1];
}
int dj1()
{
	int sum=0;
	for(int i=1;i<=n;i++)
	{
		sum+=m[i][i];
	}
	return sum;
}
int dj2()
{
	int sum=0;
	for(int i=n,j=1;i>=1&&j<=n;i--,j++)
	{
		sum+=m[i][j];
	}
	return sum;
}
void dfs(int x,int y,int num)
{
	if(x>=2&&y==1)
	{
		int sum=0;
		for(int i=1;i<=n;i++)
		{
			sum+=m[x-1][i];
		}
		if(sum*n!=esum) return ;
	}
	if(num>n*n)
	{
		if(hang()==lie()&&hang()==dj1()&&hang()==dj2())
		{
			cout<<hang()<<endl;
			for(int i=1;i<=n;i++)
			{
				for(int j=1;j<=n;j++)
				{
					cout<<m[i][j]<<" ";
				}
				cout<<endl;
			}
			exit(0);
		}
		else return ;	
	}
	else 
	{
		for(int i=1;i<=n*n;i++)
		{
			if(!used[i])
			{
				used[i]=1;
				m[x][y]=a[i];
				if(y<n)
				{
					dfs(x,y+1,num+1);
					used[i]=0;
				}
				else
				{
					dfs(x+1,1,num+1);
					used[i]=0;
				}
			}
		}
	}
}
int main()
{
	//freopen("us1.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n*n;i++)
	{
		cin>>a[i];
		esum+=a[i];
	}
	sort(a+1,a+n+1);
	dfs(1,1,1);
	return 0;
}
2020/8/2 16:20
加载中...