解决方案 »

  1.   

    http://blog.csdn.net/itlijunjie/article/details/12586261这里有些注释,参考一下
      

  2.   

    你参考的程序也太"穷举"了吧?而且,我试过他的代码了,速度非常慢,中间还有停顿的现象。依我看,这个问题就其实两个关键步骤:
    第一步、全排列
    第二步、对于某一种排列,检测其是否符合魔方阵,符合的输出第二步好理解,剩下的就是“全排列”函数了,一个DFS算法即可搞定,而且比他的快多了public class AllPerm { public static int[][] qipan=new int[3][3];
    public static int count=0;
    /**深度优先型全排列
     */
    public static void allPerm(int[] indexArray,int level){
    if(level==indexArray.length-1){
    //到达子节点 检测、输出
    checkAndPrint(indexArray);
    }else{
    //递归第一个子节点
    allPerm(indexArray, level+1);
    for(int i=level+1;i<indexArray.length;i++){
    //提取前缀
    swap(indexArray, level, i);
    //递归对应子树
    allPerm(indexArray, level+1);
    //回溯
    swap(indexArray, level, i);
    }
    }
    }
    public static void checkAndPrint(int[] indexArray){
    int index=0;
    for(int i=0;i<3;i++){
    for(int j=0;j<3;j++){
    qipan[i][j]=indexArray[index];
        index++;
    }
    }
    //行检测
    for(int i=0;i<3;i++){
    int sum=0;
    for(int j=0;j<3;j++){
    sum+=qipan[i][j];
    }
    if(sum!=15){
    return;
    }
    }
    //列检测
    for(int j=0;j<3;j++){
    int sum=0;
    for(int i=0;i<3;i++){
    sum+=qipan[i][j];
    }
    if(sum!=15){
    return;
    }
    }
    //对角线检测
    int sum=0;
    for(int i=0;i<3;i++){
    sum+=qipan[i][i];
    }
    if(sum!=15){
    return;
    }
    sum=0;
    for(int i=0;i<3;i++){
    sum+=qipan[i][2-i];
    }
    if(sum!=15){
    return;
    }
    count++;
    System.out.println("第"+count+"个结果:");
    for(int i=0;i<3;i++){
    for(int j=0;j<3;j++){
    System.out.print(qipan[i][j]+" ");
    }
    System.out.println();
    }
    }
    public static  void swap(int[] array,int a,int b){
    int temp=array[a];
    array[a]=array[b];
    array[b]=temp;
    } public static void main(String[] args) {
    int[] indexArray=new int[9];
    for(int i=0;i<9;i++){
    indexArray[i]=i+1;
    }
    allPerm(indexArray, 0);
    }
    }