方法一:全排列之后判断,复杂度很大,只能测到3阶
//全排列(注意回溯),再判断
#include<stdio.h>
#include<math.h>
#define N 100
int judge[N][N];
void f(int *a,int n,int m){
int i,temp,j,k,h,sum1,sum2;
if(m==n){
k=1;
h=sqrt(n);
for(i=1;i<=h;i++){
for(j=1;j<=h;j++){
judge[i][j]=a[k];
k++;
}
}
for(i=1;i<=h;i++){
sum1=0;
sum2=0;
for(j=1;j<=h;j++){
sum1+=judge[i][j];
sum2+=judge[j][i];
}
if(i==1) temp=sum1;
if(sum1!=sum2||sum1!=temp) return;
else temp=sum1;
}
sum1=0;
sum2=0;
for(i=1;i<=h;i++){
sum1+=judge[i][i];
}
for(i=1;i<=h;i++){
sum2+=judge[i][h-i+1];
}
if(sum1==sum2&&sum1==temp){
for(i=1;i<=h;i++){
for(j=1;j<=h;j++){
printf("%-3d",judge[i][j]);
}
putchar('\n');
}
putchar('\n');
}
return;
}
for(i=m;i<=n;i++){
temp=a[m];
a[m]=a[i];
a[i]=temp;
f(a,n,m+1);
temp=a[m];//回溯
a[m]=a[i];
a[i]=temp;
}
}
int main(){
int n,a[N],i;
do{
printf("输入n:");
scanf("%d",&n);
}while((int)sqrt(n)*(int)sqrt(n)!=n);
for(i=1;i<=n;i++){
a[i]=i;
}
f(a,n,1);
return 0;
}
方法一:按规律来,即c语言课后题解析,只能求奇数阶
#include<stdio.h>
#define N 100
void f(int (*a)[N],int n){
int i=0,j=n/2,k;
int t1,t2;
a[i][j]=1;
for(k=2;k<=n*n;k++){
t1=i--;
t2=j++;
if(i==-1) i=n-1;
if(j==n) j=0;
if(a[i][j]!=0||(t1==0&&t2==(n-1))){
i=t1+1;
j=t2;
if(i==n) i=0;
a[i][j]=k;
}else if(a[i][j]==0){
a[i][j]=k;
}
}
}
int main(){
int a[N][N]={0};
int n,i,j;
printf("请输入n:");
scanf("%d",&n);
f(a,n);
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%-5d",a[i][j]);
}
putchar('\n');
}
return 0;
}