Java打印N阶回形方阵打印

某厂面试题,定义一个int类型变量N,控制台打印结果如下:

N=4: 01 02 03 04 12 13 14 05 11 16 15 06 10 09 08 07

N=6: 01 02 03 04 05 06 20 21 22 23 24 07 19 32 33 34 25 08 18 31 36 35 26 09 17 30 29 28 27 10 16 15 14 13 12 11 N的取值为正整数,按要求写出该方法。

题目分析: 以N=6的6x6阶矩阵为例: 抽象定义该矩阵每层外圈的四个角自左上到左下顺时针为:ABCD 如第一圈:01-06-11-16 第二圈的A-B-C-D为20-07-10-17 除去第一行后续方向 B-C&C-D长度相等, 且连接BD可形成等边三角形, 且其边长自N-1开始,每1个等腰三角形形成后长度-1。 抽象理解回形数字流转方向,自B开始 BC CD DA AB流转顺序为:下左上右 循环

除去第一行后,第一个等腰三角形三点为07-11-16 两腰分别为:07 08 09 10 11 - 12 13 14 15 16 长度为N-1=5 下一个三角形与此类似且长度为N-1-1=4

因此我们定义几个变量

    方向:表示数字流转方向:下左上右 4次一循环 下左上右分别为:0 1 2 3 边长:每两条形成后,边长自N-1开始以1 为步长递减

面对N阶矩阵,可将其放入二维数组中,本文采用Java语言进行解题 NxN阶行列式 生命NxN大小的二维数组

private static final int DOWN = 0;	//向下
    private static final int LEFT = 1;	//向左
    private static final int UP = 2;   	//向上
    private static final int RIGHT = 3;  //向右

    public static void main(String[] args) {
          
   
        int n = 6;
        int[][] roundsNum = new int[n][n];

        int number=1;
        int i=0,j=0;
        //先单独处理第一行
        while(i==0&&j<n) {
          
   
            roundsNum[i][j] = number++;
            j++;
        }
        j--;//以此题为例,因为最后一次判断时j=6 while false,因此需要进行-1处理

        int direction = 0;//定义方向
        int step = n-1; //初始变长
        int currentStep=0;//已经步长

        while(roundsNum[i][j]!=n*n) {
          
   
            switch(direction%4){
          
   
                case DOWN:
                    i++;
                    break;
                case LEFT:
                    j--;
                    break;
                case UP:
                    i--;
                    break;
                case RIGHT:
                    j++;
                    break;
            }

            roundsNum[i][j] = number++;
            currentStep++;

            if(currentStep % step == 0) {
          
   
                direction++;//当走完一个完整长度时,方向转变
                if(currentStep == step*2) {
          
   //走完一个等腰三角形,则将当前已走步数清0,并将步长减1
                    step--;
                    currentStep=0;
                }
            }

        }

        for (int x=0;x<n;x++){
          
   
            for (int y=0;y<n;y++){
          
   
                Integer integer = new Integer(roundsNum[x][y]);
                if(integer.toString().length()==1){
          
   
                    System.out.print("0" +
                            ""+roundsNum[x][y]+" ");
                }
                else {
          
   
                    System.out.print(roundsNum[x][y] + " ");
                }
            }
            System.out.println(" ");
        }
经验分享 程序员 微信小程序 职场和发展