java 奇数阶幻方全解(连续摆数法)

来源:互联网 发布:佛教源码 编辑:程序博客网 时间:2024/05/20 17:10

package practice;

public class magic_2 {

public static int[][] creat(int i, int j,int n,int number,int number1,int mat[][]) {    for (int k = 1; k <= n * n; k++) {            mat[i][j] = k;        if (k % n == 0)            //对角线已满的时候可以上下左右4种情况            switch (number) {            case 0:i = (i + 1) % n;break;       //下一行            case 1:i = (i - 1 + n) % n;break;   //上一行            case 2:j = (j - 1 + n) % n;break;   //左一列            case 3:j = (j + 1) % n;break;       //右一列            default: break;            }        else {            //下一位置有可能出现的情况            switch (number1) {            case 0:    //右上方                i = (i - 1 + n) % n;                j = (j + 1) % n;                break;            case 1:   //右下方                i = (i + 1) % n;                j = (j + 1) % n;                break;            case 2:  //左上方                i = (i - 1 + n) % n;                j =  (j - 1 + n) % n;                break;            case 3:   //左下方                i =(i + 1) % n;                j =  (j - 1 + n) % n;                break;            default:                break;            }        }        //如果出现错误直接返回null。        if (i<0||i>=n) {            return null;        }    }        return mat;

}

 public static boolean test(int n,int mat[][]){        boolean bool =true;   //新建a,b,c数组分别用来保存 mat数组的每一行,每一列和两个对角线之和       int a[]=new int[mat.length];       int b[]=new int[mat.length];       int c[]=new int[2];           for(int i=0;i<mat.length;i++){        //计算行,列,对角线的和             for(int j=0;j<mat[i].length;j++){                   a[i]+=mat[i][j];                   b[i]+=mat[j][i];               }             c[0]+=mat[i][i];             c[1]+=mat[i][mat.length-1-i];           }           for(int i=0;i<mat.length;i++){     //判断其和是否满足,不满足则bool=false               if(a[i]!=(1+mat.length*mat.length)/2*mat.length||                       b[i]!=(1+mat.length*mat.length)/2*mat.length||                          c[0]!=(1+mat.length*mat.length)/2*mat.length||                            c[1]!=(1+mat.length*mat.length)/2*mat.length)                   bool=false;           }           return bool;

}

 public static void print(int k,int mat[][]){        System.out.println("第"+k+"种情况:");       for(int i=0;i<mat.length;i++){           for(int j=0;j<mat[i].length;j++)               System.out.print(mat[i][j]+"   ");           System.out.println();       }  }public static void main(String arg[]) {    int n=3,k=1;           //代表幻方阶数,k用来计数输出的个数    int number = 0;        //对角线已满的时候可以上下左右4种情况    int number1 = 0;       //下一位置有可能出现的情况    int mat[][] = new int[n][n];    for (int i = 0; i < n; i++) {        for (int j = 0; j < n; j++) {            for (number = 0; number <= 3; number++) {                for (number1 = 0; number1 <=3;  number1++) {                        mat =  creat(i,j,n,number,number1,mat);                        if (test(n,mat)){                                 print(k,mat);                                 k++;                        }                    }                }        }    }}

}

原创粉丝点击