输出"魔方阵"。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如,三阶魔方阵为
8 1 6
3 5 7
4 9 2
要求输出1~n*n的自然数构成的魔方阵。
解:魔方阵中各数的排列规律如下:
(1)将1放在第1行的中间一列。
(2)从2开始直到n×n止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列).
(3)如果上一数的行数为1,则下一个数的行数为n(指最下一行)。例如,1在第一行,则2应放在最下一行,列数同样加1.
(4)当上一个数的列数为n时,下一个数的列数应为1,行数减1.例如,2在第3行最后一列,则3应放在第2行第1列。
(5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如,按上面的规定,4应该放在第1行第2列,但该位置已经被1占据,
所以4就放在3的下面。7应该放在第3行第1列,但该位置已经被4占据,故7放在6下面。
按此方法可以得到任何阶的魔方阵。
注意:魔方阵的阶数应奇数,程序指定其最大值为15。今定义数组a为16行16列,对第0行0列不用来存放数据,只用第1~15行,使读者看程序时比较符合习惯。
1 #include<stdio.h> 2 #include<stdlib.h> 3 #define SIZE 50; 4 main() 5 { 6 int row, col, n, value; 7 int a[SIZE+1][SIZE+1]; 8 printf("请输入要输出魔方阵的阶数n(奇数, <%d):n=",SIZE); 9 scanf("%d",&n); 10 if(!(n%2)||n<1||n==0) 11 { 12 printf("输入有误!\n"); 13 exit(0); 14 } 15 row = 1; col = (n+1)/2; value = 1; 16 while(value<=n*n) 17 { 18 a[row][col] = value; 19 if(value%n!=0) 20 { 21 row--; 22 col++; 23 if(row<1) 24 row=3; 25 if(col>n) 26 col=1; 27 } 28 else 29 row++; 30 value=value+1; 31 } 32 printf("\n%d 阶魔方阵如下所示:\n\n",n); 33 for(row = 1; row <= n; row++) 34 { 35 for(col = 1; col <= n; col++) 36 printf("%5d",a[row][col]); 37 printf("\n"); 38 } 39 }