奇数阶魔方阵不得结果。望高手指点。先谢谢。
魔方阵的排列规律如下:(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;
}
----------------解决方案--------------------------------------------------------
你的for循环里有严重的问题!看看我改的
for (i=2;i<=m*m;++i)
{
if(a[(j-1+m)%m][(k+1)%m]==0)
{
j=(j-1+m)%m;
k=(k+1)%m;
}
else
j=(j+1)%m;
a[j][k]=i;
}
不加注释应该能懂吧!就是你的思路!
----------------解决方案--------------------------------------------------------
改的非常不错。
的确是前后矛盾。你说矛盾多好。在我看了又看之后。我看到矛盾!!
----------------解决方案--------------------------------------------------------
Think like a computer .it is so difficult
----------------解决方案--------------------------------------------------------