哪个兄弟可以用数组写个魔方的代码呀,我想了很就都想不出来
显示结果:
8 1 6
3 5 7
4 9 2

解决方案 »

  1.   

    以前网上看到过的一个。。
    如果您会解奇数魔术方阵,要解这种方阵也就不难理解,首先我们令n=2(2m+1),并将整个方阵看作是数个奇数方阵的组合,如下所示: 
       A B
       C D首先依序将A、B、C、D四个位置,依奇数方阵的规则填入数字,填完之後,方阵中各行的和就相同了,但列与对角线则否,此时必须在A-D与C- B之间,作一些对应的调换,规则如下:将A中每一列(中间列除外)的头m个元素,与D中对应位置的元素调换。 
    将A的中央列、中央那一格向左取m格,并与D中对应位置对调 
    将C中每一列的倒数m-1个元素,与B中对应的元素对调 
    public class Matrix {
        public static int[][] magic22mp1(int n) {
            int[][] square = new int[n][n]; 
            magic_o(square, n/2); 
            exchange(square, n);         
            
            return square;
        }
        
        private static void magic_o(int[][] square, int n) {
            int row = 0; 
            int column = n / 2; 
            for(int count = 1; count <= n*n; count++) { 
                square[row][column] = count;            // 填A  
                square[row+n][column+n] = count + n*n;  // 填B  
                square[row][column+n] = count + 2*n*n;  // 填C  
                square[row+n][column] = count + 3*n*n;  // 填D  
                if(count % n == 0) 
                    row++; 
                else { 
                    row = (row == 0) ? n - 1 : row - 1 ;  
                    column = (column == n-1) ? 0 : column + 1; 
                } 
            }
        }
        
        private static void exchange(int[][] x, int n) {
            int i, j; 
            int m = n / 4; 
            int m1 = m - 1;  
            for(i = 0; i < n/2; i++) { 
                if(i != m)  {    
                    for(j = 0; j < m; j++)          // 处理规则 1  
                        swap(x, i, j, n/2+i, j); 
                    for(j = 0; j < m1; j++)         // 处理规则 2  
                        swap(x, i, n-1-j, n/2+i, n-1-j); 
                } 
                else {  // 处理规则 3  
                    for(j = 1; j <= m; j++) 
                        swap(x, m, j, n/2+m, j); 
                    for(j = 0; j < m1; j++) 
                        swap(x, m, n-1-j, n/2+m, n-1-j); 
                } 
            } 
        }
        
        private static void swap(int[][] number,
                                    int i, int j, int k, int l) {
            int t; 
            t = number[i][j]; 
            number[i][j] = number[k][l]; 
            number[k][l] = t;
        }
        
        public static void main(String[] args) {
            int[][] magic = Matrix.magic22mp1(6);
            
            for(int k = 0; k < magic.length; k++) {
                for(int l = 0; l < magic[0].length; l++) {
                    System.out.print(magic[k][l] + " ");
                }
                System.out.println();
             }
        }