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;
}