2006
08-05

:打印”魔方阵”,所谓魔方阵是指这样的方阵,它的每一行,每一列和对角线之和均相等.例如,三阶魔方为:


8 1 6


3 5 7


4 9 2


要求打印由1到n*n的自然数构成的魔方阵.


及待回复!!!!!!!!!!


魔方阵》有 5 条评论

  1. ningweidong 说:

    不会偶数幻方,只会做奇数幻方.规则是这样的:1写在第一行,中间那个位置.然后斜向上45度,找下一个位置,如果行或者列出界了,就写到另一端去.如果行和列同时出界.就写在该位置的下方.如果下一个位置已经有元素了,也写在位置的下方.

    比如一个3*3幻方.1写在(1,2),然后下一个位置,(0,3),这时行就出界了,就写到另一端去,写在(3,3).下一个位置,(2,4),这时列又出界了,就写在另一端,(2,1).下一个位置是(1,2),可这个位置已经写过了,不能再写了,就写在这个位置的下面,是(2,1)的下面,(3,1).等到(1,3),下一个位置是(0,4),行和列同时出界,也写在下面,是(1,3)的下面(2,3).

  2. ningweidong 说:

    #include <iostream.h>

    void main()

         const int x = 9;//定义幻方的阶数

         int n = 1;//要放置的元素
         int a[x][x] = {0};//幻方全部置0
         int i = 0;
         int j = x/2;//第一个位置是第0行,中间那个位置
     
         while (n <= x*x)
         {
               a[i][j] = n;
               i–;
              j++;//找下一个位置
              if (i<0 && j>(x-1))//如果行和列同时出界,就找下面的位置
               {
                    i += 2;
                    j -= 1;
               }

               if ( i < 0 )//如果只有一个出界,就写到另一端去.
               {
                    i = x-1;
               }
      
               if (j > (x-1))
              {
                    j=0;
               }

               if (a[i][j] != 0)//如果下一个位置上已经有元素了,也写在下面
              {
                    i += 2;
                    j -= 1;
               }
      
              n++;
         }

     

     //打印这个幻方
         for (i=0; i<x; i++)
         {
               for (j=0; j<x; j++)
               {
                    cout << setw(4) << a[i][j];
               }
               cout << endl;
         }

    }

  3. ningweidong 说:

    如果你是用的是TC,把iostream.h换成stdio.h,下面所有的cout都换成printf,就可以在TC下编译了.

  4. 冰的热度 说:

    #include “stdio.h”

    void main()

    {int a[16][16],i,j,k,p,n;

    p=1;

    while(p==1)

    {printf(“enter n(n=1 to 15):”);

    scanf(“%d”,&n);

    if((n!=0)&&(n<=15)&&(n%2!=0))

    p=0;

    }

    for(i=1;i<=n;i++)

       for(j=1;j<=n;j++)

            a[i][j]=0;

    j=n/2+1;

    a[1][j]=1;   注意是a[1][j]而不是a[i][j]

    for(k=2;k<=n*n;k++)

    {i=i-1;

    j=j+1;

    if((i<1)&&(j>n))

    {i=i+2;

    j=j+1;

    }

    else

       {if(i<1) i=n;

    if(j>n) j=1;

    }

    if(a[i][j]==0)

      a[i][j]=k;

    else

    {i=i+2;

    j=j-1;

    a[i][j]=k;

    }

    }

    for(i=1;i<=n;i++)

        {for(j=1;j<=n;j++)

    printf(“%5d”,a[i][j]);

    printf(“\n”);

    }

    }

  5. 冰的热度 说:

    注意第21行应是y=y-1;而不是y=y+1;

留下一个回复