A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

我的思路是:将螺旋的路线想象成开车路线,然后再这个路线上给数组赋从小到大的值(从1开始),当前方没有路时,就转弯,有路,就给数组赋值。每一次赋值方向的改变就相当于开车转弯。赋值的方向用变量记录(如下int turn),方向的改变用函数操作(如下public static int nextTurn(int x) {...})。
* **/
public class PrintNumber {

        public static void main(String[] args) {
                int[][] arr = new int[4][4];/*创建一个任意边长的等边二位数组*/
                arr=setValue(arr);/*将给数组赋值的功能封装起来*/
                sopArr(arr);/*将遍历输出数组的功能封装起来*/
                System.out.println("---------------------------------");
                int[][] arr1 = new int[7][7];/*创建一个任意边长的等边二位数组*/
                arr1=setValue(arr1);/*将给数组赋值的功能封装起来*/
                sopArr(arr1);
               
        }
       
        public static int[][] setValue(int[][] arro){
                int[][] arr = arro;/*定义一个二位等边数组*/
                int i = 0;/*定义变量代表数组的下标*/
                int j = 0;
                int x = i;/*定义变量来记录数组下标的值,用于后面判断数组下标是否移动*/
                int y = j;
                int turn = 1;/*定义数组遍历赋值的方向*/
                boolean setValue = false;/*定义变量来代表给数组赋值是否成功*/
                int value = 1;/*定义变量代表给数组赋的值*/
               
                while (value <= arr.length * arr[0].length) {
                        if (arr[i][j] == 0) {/*先判断前方(下一个数组元素)是否有路(是否有值)。*/
                                arr[i][j] = value;/*如果有路,就赋值*/
                                if(value == arr.length * arr[0].length)/*如果赋值后到了末尾,就退出循环*/
                                        break;
                                setValue = true;/*标记赋值成功*/
                                value++;/*赋值成功后,才递增数值*/
                        }else{
                                setValue =false;/*标记赋值失败*/
                                switch (turn) {/*因为赋值失败,但是数组角标在上一循环已经递增过了,所
                                以要后退一步,用switch语句来根据方向后退*/
                                case 1:
                                        j--;
                                        break;
                                case 2:
                                        i--;
                                        break;
                                case 3:
                                        j++;
                                        break;
                                case 4:
                                        i++;
                                        break;
                                }
                        }
                       
                        /*判断是否赋值成功*/ /* "i > arr.length - 2 "判断是不是延最外圈开车开到头了;"y==j"是
                        判断是不是开车方向没有改变,true说明没改变。*/
                        /* "i < 1&& j<0"判断是不是延最外圈开车开到头了,并且不是在起点。*/
                        /*"j < 1 && i>2"判断是不是延最外圈开车开到头了,并且不是在左下角*/
                        if ((!setValue) | (i > arr.length - 2 && y==j) | (i < 1 && j<0)
                                        | (j > arr.length - 2 && x==i) |(j < 1 && i>arr.length - 2)) {
                                turn =nextTurn(turn);/*转弯*/
                        }
                        x= i;/*在给数组角标递增前,记录数组角标,以便于判断,角标递增后,开
                        车方向是否有改变*/
                        y= j;
                        switch (turn) {/*根据现在得开车方向递增数组角标*/
                        case 1:
                                j++;
                                break;
                        case 2:
                                i++;
                                break;
                        case 3:
                                j--;
                                break;
                        case 4:
                                i--;
                                break;
                        }
                       
                }
                return arr;
        }
public static void  sopArr(int[][] arr){
        /*遍历输出数组*/
        for(int out = 0; out < arr.length; out++){
                for(int in = 0; in <arr[out].length;in++){
                        System.out.print(arr[out][in] +"  ");
                        if(arr[out][in]<10)
                                System.out.print(" ");/*个位数时,补齐与2尾数的位置差,便于美观输出*/
                }
                System.out.println();/*换行*/
        }
}
        /*按顺时针的方向,开车转向*/
        public static int nextTurn(int x) {
                switch (x) {
                case 1:
                        x = 2;
                        break;
                case 2:
                        x = 3;
                        break;
                case 3:
                        x = 4;
                        break;
                case 4:
                        x = 1;
                        break;
                }
                return x;
        }

       
}


评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

2 个回复

倒序浏览
值得学习ing!
回复 使用道具 举报

771技术分,还向我学习,太谦虚了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马