把1到81放到9*9的方格中,要求:所有的横行、竖行及最大的两个对角线上的数相加都等于同一个数

解决方案 »

  1.   

    1)、当n为奇数时:采用连续斜行赋值法。首先把数1定在正中的下一格,数2定在1的斜行右下格,依此类推。即一般数i定在数i-1的斜行右下格(行数x列数y均增1)。直至当数i为n的倍数时,定在上一个数i-1格正下方的第2格(行数x增2,列数y不变)。按上述操作,格的位置(x,y)若超出n行n列的范围,按模n定位。即若出现x>n,则定在第x-n行;出现y>n,则定在第y-n列。   
    2)、当n为4的倍数时:采用对称元素交换法。首先把数n×n-1按行从上至下,奇数行从左至右,偶数行从右至左顺序填人方阵的n×n格。然后,把方阵的所有4×4子方阵中的两对角线上位置(即(i-j)   mod   4=0||(i+j-1)   mod   4=0,其中i为行号,j为列号)上的数固定下来不动;所有其它位置上的数关于方阵中心作对称交换,也就是把元素a(i,j)与元素a(n+1-i,n+1-j)的值交换。   
    3)、当n为非4倍数的偶数(即4m+2形)时:首先把大方阵分解为4个奇数(2m+1阶)子方阵。上述奇数阶魔方给分解的4个子方阵对应赋值,上左子方最小(i),下右子次小(i+v),下左子方最大(i+3v),上右子方次大(i+2v),即4个子方阵对应元素相差v,其中v=n*n/4,然后作相应的元素交换:   
        a(i,j)与a(i+u,j)在同一列做对应交换(j<t或j>n-t+2)   
        a(t,1)与a(t+u,1);a(t,t)与a(t+u,t)两对元素交换   
        其中u=n/2,t=(n+2)/4   
        上述交换使每行每列与两对角线上元素之和相等。
      

  2.   

    帖一个奇数阶的。
    #include   <iostream.h>   
      #include   <conio.h>   
      #include   <stdio.h>   
      void   main()   
      {   int   a[22][22],n,j,i,row,col,num;   
          while(1)   
          {cout<<"please   entered   an   odd   number   from   0   to   20"<<endl;   
            cout<<"an   odd   number   is:";cin>>n;   
            cout<<"you   entered   the   number   is   :"<<n<<endl;   
            if(n<0   ||   n>20   ||   (n%2)==0)   cout<<"the   nmumber   is   error!"<<endl;   
            else   break;   
          }   
          for(i=0;i<n+2;i++)   
              for(j=0;j<n+2;j++)   
              {   a[i][j]=0;   
                  if(i==0   ||   j==0   ||i==n+1   ||j==n+1)   a[i][j]=-1;   
              }   
          row=1;col=(n/2+1);   
          for(num=1;num<=n*n;num++)   
          {a[row][col]=num;i=row-1;j=col+1;   
            if(a[i][j]!=-1)   
                if(a[i][j]==0)   {row=i;col=j;}   
                else   row=i+2;   
            else   
                {if(i==0&&j!=n+1)   {row=n;col=j;}   
                  if(j==n+1&&i!=0)   {row=i;col=1;}   
                  if(i==0&&j==n+1)     row=i+2;   
                  }   
          }   
          for(i=1;i<n+1;i++)   
          {   for(j=1;j<n+1;j++)   
                    printf("%4d,",a[i][j]);   
              cout<<endl;   
          }   
      }
      

  3.   

    public static void sort(int n)  //make sure "n" is odd number,like "9".
            {
                int[,] a = new int[n+2, n+2];
                int i, j, row, col, num;
                
                for (i = 0; i < n + 2; i++)
                    for (j = 0; j < n + 2; j++)
                    {
                        a[i, j] = 0;
                        if (i == 0 || j == 0 || i == n + 1 || j == n + 1) 
                            a[i, j] = -1;
                    }
                row = 1; col = (n / 2 + 1);
                for (num = 1; num <= n * n; num++)
                {
                    a[row, col] = num; 
                    i = row - 1; 
                    j = col + 1;
                    if (a[i, j] != -1)
                        if (a[i, j] == 0) 
                        { 
                            row = i; col = j; 
                        }
                        else 
                            row = i + 2;
                    else
                    {
                        if (i == 0 && j != n + 1) { row = n; col = j; }
                        if (j == n + 1 && i != 0) { row = i; col = 1; }
                        if (i == 0 && j == n + 1) row = i + 2;
                    }
                }
                for (i = 1; i < n + 1; i++)
                {
                    for (j = 1; j < n + 1; j++)
                    {
                        Console.Write(a[i, j].ToString() + " ");
                    }
                    Console.Write("\r\n");
                }
                Console.Read();
            }
            
            //can runing in vs2005.
      

  4.   

    这个算法很麻烦的。一般人编这个恐怕要好久。你还是google一下吧。找到算法写代码就比较容易了。