java实现 n阶幻方(奇偶通用)

来源:互联网 发布:手机声音剪辑软件 编辑:程序博客网 时间:2024/05/18 04:45
/*******测试代码,改变数字即可************/
public class MagicTest {        public static void main(String[] args) {        Magic m=new Magic(4);        m.printMagic();    } }
/********n阶幻方(魔方)********/
public class Magic {    private int n;    private int[][] I;    private int[][] J;        public Magic(int n) {        this.n = n;    }    public int[][] getMagic(){        int[][] M=null;        if(n<=2)return M;        if(n%2==1){            meshGrid();            M=new int[n][n];            for(int i=0;i<n;i++)                for(int j=0;j<n;j++){                    int a=mod(I[i][j]+J[i][j]-(n+3)/2,n);                    int b=mod(I[i][j]+2*J[i][j]-2,n);                    M[i][j]=n*a+b+1;                }        }        else if(n%4==0){            meshGrid();            M=reshape();            for(int i=0;i<n;i++)                for(int j=0;j<n;j++){                    int a=(int)Math.floor(mod(I[i][j],4)/2.0);                    int b=(int)Math.floor(mod(J[i][j],4)/2.0);                    if(a==b){                        M[i][j]=n*n+1-M[i][j];                    }                }        }        else{            int p=n/2;            Magic magic=new Magic(p);            int[][] temp=magic.getMagic();            M=new int[n][n];            for(int i=0;i<p;i++){                for(int j=0;j<p;j++){                    M[i][j]=temp[i][j];                    M[i][j+p]=temp[i][j]+2*p*p;                    M[i+p][j]=temp[i][j]+3*p*p;                    M[i+p][j+p]=temp[i][j]+p*p;                }            }            int k=(n-2)/4;            for(int j=0;j<k;j++){                for(int i=0;i<p;i++){                    int t=M[i][j];                    M[i][j]=M[i+p][j];                    M[i+p][j]=t;                }            }            for(int j=n-k+1;j<n;j++){                for(int i=0;i<p;i++){                    int t=M[i][j];                    M[i][j]=M[i+p][j];                    M[i+p][j]=t;                }            }            int t=M[k][0];M[k][0]=M[k+p][0];M[k+p][0]=t;            t=M[k][k];M[k][k]=M[k+p][k];M[k+p][k]=t;        }        return M;    }    private void meshGrid(){        if(n>2){            I=new int[n][n];            J=new int[n][n];            for(int i=0;i<n;i++)                for(int j=0;j<n;j++){                    I[i][j]=i+1;                    J[i][j]=j+1;                }        }    }    private int[][] reshape(){        if(n>2){            int[][] M=new int[n][n];            for(int i=0;i<n;i++)                for(int j=0;j<n;j++){                    M[i][j]=i*n+j+1;                }            return M;        }        return null;    }    private int mod(int a,int n){        int m=a%n;        if(m<0)            m+=n;        return m;    }    public void printMagic(){        this.getMagic();        int[][] a=this.getMagic();        for(int i=0;i<a.length;i++){            for(int j=0;j<a[i].length;j++){                System.out.print(a[i][j]+"\t");            }            System.out.println();        }    }}



0 0
原创粉丝点击