奇数阶魔方阵不得结果。望高手指点。先谢谢。
魔方阵的排列规律如下:(1)将1放在第一行中间一列;
(2)从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1
(3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行);
(4)当上一个数的列数为n时,下一个数的列数应为1,行数减去1。
(5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。
#include<stdio.h>
#include<math.h>
int main()
{
int i,j,k,m,n;
int a[16][16]={0};
do
{
scanf("%d",&i);
}
while(i>=15||i%2==0||i<0);//初始化,输入阶数 i
m=i;
a[0][(i-1)/2]=1;//将1放在第一行中间一列;
j=0;k=(i-1)/2;
for (i=2;i<=m*m;i++)
{
j=j-1;//从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1
k=k+1;
if (j<0)//如果上一个数的行数为1,则下一个数的行数为n(指最下一行);
j=m-1;
else if (k==(m-1))//当上一个数的列数为n时,下一个数的列数应为1,行数减去1
k=0;
else if (a[j][k]!=0)//如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。
{
j=j+2;
k=k-1;
}
else if (j==0&&k==(m-1))
{
j=j+2;
k=k-1;
}
a[j][k]=i;
}
printf("this is the magic array:\n");//打印结果。
for (j=0;j<m;j++)
{
for(k=0;k<m;k++)
{
printf("%3d",a[j][k]);
}
printf("\n");
}
return 0;
}