奇数幻方

给定一个奇数n,比如n=3,生成1到n平方的数,如1到9,填入九宫格,使得横竖斜的和都相等。

奇数幻方口诀:

  • 1放置在第一行的中间。
  • 顺序将2,3,dots等数放在右上方格中。
  • 当右上方格出界的时候,则由另一边进入。(把第最后一行当作第一行的上方,把最左边的一列当作最右边的右边)
  • 当右上方格中已经填有数,则把数填入正下方的方格中。
  • 按照以上步骤直到填写完所有N^2个方格。

如输入3得到结果

8    1    6    
3    5    7    
4    9    2    

代码为:

package huanHuang;

public class HF {
    public static int[][] square(int n){
        int[][] martix=new int[n][n];
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                martix[i][j]=0;
        int i=0;
        int j=n/2;
        martix[i][j]=1;
        for(int k=2;k<=n*n;k++){
            if(i>=1 && j<n-1){//非第一行且右边不越界
                if(martix[i-1][j+1]==0){//若数字的右上方未填充数字,这把右上方写入K;
                    i--;
                    j++;
                }
                else{//否则在数子的下方写入K;
                    i++;
                }    
            }
            else if(i==0 && j<n-1){//第一行右边不越界
                if(martix[n-1][j+1]==0){
                    i=n-1;
                    j++;
                }
                else{
                    i++;
                }
            }
            else if(i>=1 && j==n-1){//非第一行右边越界
                if(martix[i-1][0]==0){
                    i--;
                    j=0;
                }
                else{
                    i++;
                }
            }
            else{//第一行且右边越界
                if(martix[0][n-1]==0)
                {
                    i=0;
                    j=n-1;
                }
                else{
                    i++;
                }
                
            }
            martix[i][j]=k;
            
        }
        return martix;
    }
    public static void main(String[] args) {
        int n=3;
        int[][] m=HF.square(n);
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                System.out.print(m[i][j]+"	");
            }
            System.out.println();
        }

    }

}

  

原文地址:https://www.cnblogs.com/enjoy-life-clh/p/4800410.html