巧排魔方阵
一、第一行的中间列位置的数是1。
二、若数K是n的整数倍,则数K+1在数K的下方,若数K在最后一行,则数K+1在第一行对应的位置上。
三、若数K不是n的整数倍,则数K+1在数K的右上方,即数K的行减-、列加一的位置上。若数K在第一行,则数K+1在最后一行相对应的位置上;若数K在最后一列,则数K+1在第一列相应的位置上。
根据以上条件很容易排出一个阶数为n的魔方阵,若将这个魔方阵对称的行或列互换,就可以得到一系列新的魔方阵。
下面是我编的排魔方阵,只要稍作修改,应可扩大允许的n的范围,理论上可扩至n≤46339。该程序在SUPER386上用TURBO C2.0编译,连接后运行通过。
main()
{
int n=0,m,i,j,k,a[32][32];
while(n%2==0) {
printf("enter the umnber of n\n");
scanf("%ld",&n);
}
m=n*n;
i=1;
j=(n+1)/2;k=1;
while(k<=m) {
if(i==0) i=n;
if(j>n) j=1;
if(k%n!=0) a[i--][j++]=k++;
else a[i++][j]=k++;
}
for(i=1;i<=n;i++) {
for(j=1;j<=n;j++) printf("%4d",a[i][j]);
printf("\n");
}
}
(江苏 高健青)