求助玄关

P1406 方格填数

改了改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


|