输出"魔方阵"。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如,三阶魔方阵为
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 #include2 #include 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 else29 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 }