魔方阵,古代又称“纵横图”,是指组成元素为自然数1、2…n2的平方的n×n的方阵,其中每个元素值都不相等,且每行、每列以及主、副对角线上各n个元素之和都相等。
8 1 6
3 5 7
4 9 2
魔方阵的排列规律如下:
⑴将1放在第一行中间一列;
⑵从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列);
⑶如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;
⑷当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列;
⑸如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;
1 #include<stdio.h> 2 int main() 3 { 4 int n,sum=0,t,k,i,j; 5 scanf("%d",&n);//n阶魔方,且为奇数 6 sum=(1+n*n)*n*n/2/n; 7 int a[n][n]; 8 for(i=0;i<n;i++) 9 for(j=0;j<n;j++) 10 a[i][j]=0; 11 12 a[0][(n-1)/2]=1; 13 t=0,k=(n-1)/2; 14 for(i=2;i<=n*n;i++) 15 { 16 int s,m; 17 s=t; 18 m=k; 19 t=(t+n-1)%n; 20 k=(k+n+1)%n; 21 22 if(0==a[t][k]) 23 { 24 a[t][k]=i; 25 26 } 27 else 28 { 29 s=(s+1)%n; 30 a[s][m]=i; 31 t=s; 32 k=m; 33 } 34 35 36 } 37 for(i=0;i<n;i++) 38 { 39 for(j=0;j<n;j++) 40 { 41 printf("%d ",a[i][j]); 42 43 } 44 printf(" "); 45 } 46 }