首页 > 用户发贴区 > 编程问题提问区 > 小弟请教:魔方阵
2008
02-16

小弟请教:魔方阵

原题是这样的:


      所谓魔方阵是指这样的一个方阵,它的每一行,每一列与对角线各元素之和均相等。例如,三阶魔方阵为:


      8      1      6


      3      5      7


      4      9      2


      请打印出由1到n2(n的平方)的自然数构成的魔方阵。


请诸位指点一下思路,小弟在此行礼了。


小弟请教:魔方阵》有 4 条评论

  1. szc0000 说:

    上个帖子还有一个回复。这个直接没人理……都说问题有点深度人家才会回答,可是我现在的水平实在提不出有深度的问题来啊……真的没人肯指点一下么?

  2. zheng1988 说:

    先把1放在第一行中间的位置

    然后依次把各个数向右上方来写

    碰到边界或者是应该写数的地方已经被占满了

    就在应该写数的各的正下方的格来写

    若下方也满了 或者 到达边界 则写到最上

    直至写满

  3. 倒影年华 说:

        #include <stdio.h>
    void main()
    {
     int array[16][16];                    //魔方的最大阶数:15
     int i,j,k,m,n;
     m=1;
     while(m==1)
     {
      printf(“请输入n(0—15),n是奇数:”);
      scanf(“%d”,&n);
      if(n!=0&&(n%2!=0)&&(n<=15))//距阵的阶的合法性
      {
       printf(“矩阵阶数是%d\n”,n);
       m=0;
      }
     }
     for(i=1;i<=n;i++)        //赋初值
     {
      for (j=1;j<=n;j++)
       array[i][j]=0;
     }

     j=n/2+1;                //产生魔方开始
     array[1][j]=1;                  //1:
     for(k=2;k<=n*n;k++)    //下标从2开始,到n*n结束
     {
      i=i-1;              //正常排列:行-1
      j=j+1;              //正常排列:列+1
      if((i<1)&&(j>n))
      {
       i=i+2;
       j=j-1;
      }
      else
      {
       if(i<1)
        i=n;
       if(j>n)
        j=1;
      }
      if(array[i][j]==0)
       array[i][j]=k;
      else
      {
       i=i+2;
       j=j-1;
       array[i][j]=k;
      }
     }                      //产生魔方结束
     
     for(int i=1;i<=n;i++)  //输出魔方
     {
      for(j=1;j<=n;j++)
       printf(“%5d”,array[i][j]);
      printf(“\n”);
     }
    }
    //(1)将1放在第一行中间的一列;
    //(2)从2开始直到n*n为止,各数依次按照下列规则存放:每一个数字存放的行比前一个数的行数减一,列数加一;
    //(3)如果上一个数的行数为1,则下一个数的行数为n(即最下一行);
    //(4)当上一个数的列数为n时,下一个数的列数应该1,行数减一;
    //(5)如果按照上面规则确定的位置上已有数,或者上一个数是第1行第n列时,则把下一个数放在上一个数的下面。

  4. szc0000 说:

    ……这个见鬼的魔方阵原来这么麻烦?教材居然拿来当课后题……不过好像没有用到太复杂的函数,只是程序长了点。让我好好学习一下。

    谢谢二楼和三楼的两位。三楼的程序我保存下来了,慢慢研究。谢谢您了!

留下一个回复