改了改dfs
```cpp
#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)
{
//cout<<x<<" "<<y<<" "<<g[x][y]<<"\n";
if(x==n && y==n)
{
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,yy;
if(y==n)//如果这行填满了
{
int s=0;
for(int i=1;i<=n;i++)
{
s+=g[x][i];
}
if(s!=sum)
{
return;
}
yy=1;
xx++;
}
else yy=y+1;
for(int i=1;i<=n*n;i++)
{
if(vis[i]==1)
{
continue;
}
vis[i]=1;
g[xx][yy]=a[i];
dfs(xx,yy);
vis[i]=0;
g[xx][yy]=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,0);
return 0;
}
```
by syj2017 @ 2024-09-20 08:18:37