好像是剪枝写错了
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
int a[50],sum;
int g[10][10];
bool vis[1000];
bool check()
{
//先看行和列
for(int i=1;i<=n;i++)
{
int s=0;
for(int j=1;j<=n;j++)
{
s+=g[i][j];
}
if(s!=sum)
{
return 0;
}
}
for(int i=1;i<=n;i++)
{
int s=0;
for(int j=1;j<=n;j++)
{
s+=g[j][i];
}
if(s!=sum)
{
return 0;
}
}
//看对角线
int s=0;
for(int i=1;i<=n;i++)
{
s+=g[i][i];
}
if(s!=sum)
{
return 0;
}
s=0;
for(int i=1;i<=n;i++)
{
s+=g[i][n-i+1];
}
if(s!=sum)
{
return 0;
}
return 1;
}
void dfs(int x,int y)
{
if(x==n+1 && y==1)
{
if(!check())
{
return;
}
//幻方成立
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cout<<g[i][j]<<' ';
}
cout<<'\n';
}
exit(0);
}
int xx=x;
int yy=y+1;
if(yy==n+1)//如果这行填满了
{
//---------------------------
int s=0;
for(int i=1;i<=n;i++)
{
s+=g[x][i];
}
if(s!=sum)
{
return;
}
//--------------------------
yy=1;
xx++;
}
for(int i=1;i<=n*n;i++)
{
if(vis[i]==1)
{
continue;
}
vis[i]=1;
g[x][y]=a[i];
dfs(xx,yy);
vis[i]=0;
g[x][y]=0;
}
}
signed main()
{
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n;
for(int i=1;i<=n*n;i++)
{
cin>>a[i];
sum+=a[i];
}
sort(a+1,a+n*n+1);
sum/=n;
cout<<sum<<'\n';
dfs(1,1);
return 0;
}