当前位置: 代码迷 >> C语言 >> 奇数阶魔方阵不得结果。望高手指点。先谢谢。
  详细解决方案

奇数阶魔方阵不得结果。望高手指点。先谢谢。

热度:141   发布时间:2008-04-04 08:29:05.0
奇数阶魔方阵不得结果。望高手指点。先谢谢。
魔方阵的排列规律如下:
(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;
}
搜索更多相关的解决方案: 魔方  奇数  int  结果  

----------------解决方案--------------------------------------------------------
你的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
----------------解决方案--------------------------------------------------------
  相关解决方案