所谓魔方阵是指这样的的方阵:
它的每一行、每一列和对角线之和均相等。
输入n,要求打印由自然数1到n2的自然数构成的魔方阵(n为奇数)。
例如,当n=3时,魔方阵为:
8 1 6
3 5 7
4 9 2
此题要求输入一个数据n,然后打印出奇数阶魔方阵。要打印出奇数阶魔方阵,首先要明白奇数阶魔方阵的生成方法。其生成方法如下:
(1) 第一个位置在第一行正中;
(2) 新位置应当处于最近一个插入位置右上方,但如右上方位置已超出方阵上边界,则新位置取应选列的最下一个位置,如超出右边界则新位置取应选行的最左一个位置;
(3) 若最近一个插入元素为N的整倍数,则选下面一行同列上的位置为新位置。
了解了其生成方法,就可以根据此方法来写出程序。首先设置int变量i,j,m,n。将从键盘输入的数据存入地址&n。然后再设置int数组a[MAX][MAX],由于数组在定义时,必须设置其宽度。所以在开始时定义MAX的大小,以后当出入的数字大于MAX时只需改动MAX即可。在此先设置为15。而根据生成方法可写出下列程度来实现对魔方阵的排列:
i=0,j=(n+1)/2-1; /*代表第一行最中间的一列*/
while(m<=n*n) /*一共n*n个数*/
{
a[i][j]=m;
m++,i--,j++; /*i--,j++;代表下一个数在原来那个数的右上方*/
if((m-1)%n==0&&m>=1) /* ( 1 ) */
i=i+2,j=j-1; /*(2)*/
if(i<0) i=i+n; /*超出上界则i+n*/
if(j>(n-1)) j=j-n; /*超出右边界则j-n*/
}
注释(1)其根据为第三个要求。当m-1为5的整数倍时,其位置为上一个数位置的同一列下面一行,由于当m=1时(m-1)%n=0,但不用遵循其要求所有用 if( (m-1)%n==0&&m>=1)加以限制。
注释(2)由于在执行这一步之前经历了i--,j++。则要使之位置为原来的下方则i+2,j-1; 最后利用循环语句输出结果。
其程序为:
#define MAX 15
#include <stdio.h>
main()
{ int n;
int m=1;
int i,j;
int a[MAX][MAX];
clrscr();
scanf("%d",&n);
i=0,j=(n+1)/2-1;
while(m<=n*n)
{
a[i][j]=m;
m++,i--,j++;
if((m-1)%n==0&&m>1)
i=i+2,j=j-1;
if(i<0) i=i+n;
if(j>(n-1)) j=j-n;
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{ if(a[i][j]/10==0)
printf("%d ",a[i][j]); /*对程序无影响,只是使输出的数
else printf("%d ",a[i][j]); 每一列对齐*/
if(j==(n-1)) printf("
");}
}