1,输入:魔方的阶 输出:完整的魔方
2 另外小弟还想问个问题 问题如下: 
  给定n个大小各异的立方体,这些立方体每一个面的面积在1-n之间,将这些立方体堆积成两个塔,问这两个塔的最小高的等差是多少附: 魔方阵是指元素为自然数1,2,…,N2 的N×N方阵,每个元素值均不相等,每行、列及主、副对角线上各N个元素之和都相等。对奇阶魔方阵,可用Dole Rob算法生成,其过程为:从1开始,以此插入各自然数,直到N2为止。选择插入位置原则为:a.    第一个位置在第一行的正中;b.    新位置应当处于最近一个插入位置右上方,但如右上方位置已超出方阵上边界,则新位置取应选列的最下一个位置;如超出右边界则新边界取应选行的最左一个位置;c.    若最近一个插入元素为N的整数倍,则选下面一行同列的位置为新位置。

解决方案 »

  1.   

    还有一点就是要用java语言实现
    谢了!只要进来回答就有分 说到做到
      

  2.   

    有matlab否?去看magic函数的代码。
    一般而言,奇数阶用右(左)斜上算法,偶数阶用旋臂交换法,后者有点复杂。射雕或者神雕里面,有4阶的介绍(来源于九章算术)楼主若是足够聪明,当可以推断出偶数阶是怎么实现的。
      

  3.   

    给出奇数阶的算法,偶阶的还在研究!import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;public class MagicNum {
        
        private int x;
        private int y;
        /**
         * @return 返回 x。
         */
        public int getX() {
            return x;
        }    /**
         * @param x 要设置的 x。
         */
        public void setX(int x) {
            this.x = x;
        }    /**
         * @return 返回 y。
         */
        public int getY() {
            return y;
        }    /**
         * @param y 要设置的 y。
         */
        public void setY(int y) {
            this.y = y;
        }    /**
         * @param args
         */
        public static void main(String[] args) {
            
            MagicNum mn=new MagicNum();
            printTxt(mn.createMagic(9));
        }
        
        private int[][] createMagic(int n){
            if(n>2){
                MagicNum mn=new MagicNum();
                int[][] magic =new int [n][n];
                
                //偶阶幻方算法
                if(n%2==0){
                    
                    
                }else{//奇阶幻方算法
                    mn.setX((n-1)/2);
                    mn.setY(0);
                    magic[(n-1)/2][0]=1;
                    for(int i=2;i<=n*n;i++){
                        mn.getnextXandY(magic,mn,i);
                    }
                }
                return magic;
            }else{
                System.out.print("请输入大于2的自然数");
                return null;
            }
        }
        
        /**
         * Merzirac法生成奇阶幻方
         * @param magic
         * @param mn
         * @param n
         * @return
         */
        private MagicNum getnextXandY(int[][] magic,MagicNum mn,int n){
            int x =mn.getX();
            int y=mn.getY();
            
            //左上移
            if(x+1<magic.length){
                x=x+1;
            }else{
                x=0;
            }
            
            if(y<1){
               y= magic.length-1;
            }else{
                y=y-1;
            }
            
            //判断是否有数
            if(magic[x][y]==0){
                magic[x][y] =n; 
            }else{
                //往原先的数下移一格
                x=mn.getX();
                y=mn.getY();
                
                if(y<magic.length-1){
                    y=y+1;
                }else{
                    y=0;
                }
                magic[x][y] =n; 
            }
            
            mn.setX(x);
            mn.setY(y);
            
            return mn;
        }    private static void printTxt(int[][] magic) {
            if (magic != null) {
                FileOutputStream file;
                try {
                    StringBuffer s = new StringBuffer(100);
                    String ret = "\r\n";
                    file = new FileOutputStream("c:/magic.txt");
                    for (int i = 0; i < magic.length; i++) {
                        for (int j = 0; j < magic.length; j++) {
                            s.append(magic[i][j]);
                            s.append("  ");
                            if (j == magic.length-1) {
                                s.append(ret);
                            }
                        }
                    }
                    byte[] bt = s.toString().getBytes();
                    file.write(bt);
                    file.close();
                } catch (FileNotFoundException e) {
                    System.out.print("FileNotFoundException: " + e.getMessage());
                } catch (IOException e) {
                    System.out.print("IOException: " + e.getMessage());
                } catch (Exception e) {
                    System.out.print("Exception: " + e.getMessage());
                }        }
        }
    }