二维数组的旋转赋值(递归)

 阅读约 4 分钟

描述

给定一个h行h列的整数数组array,要求从array[0][0]元素开始,按回形从外向内顺时针顺序赋值整个数组。如图所示:
![图片描述][1]
输出结果:4 4
    1  2  3  4
    12 13 14 5
    11 16 15 6
    10 9  8  7


public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int h = scanner.nextInt();//输入二维数组长度
        int[][] arr = new int[h][h];//创建二维数组
        setWay(arr,0,0);//赋值
        for (int[] p : arr) {//遍历
            for (int p1 : p) {
                System.out.printf("%-4d",p1);
            }
            System.out.println();
        }
        System.out.println(t);
    }
    static int p = 1;//所赋的值
    static int f = 0;//控制转向  0为右 1为下 2为左 3为上
    static int t = 0;//纪录函数调用次数
    public static boolean setWay(int[][]map,int i,int j){

            if(i==map.length || j ==map.length || i == -1 || j == -1){//若超出数组
                f = (f+1)%4;//转向
                t++;
                return false;
            }

            if (map[i][j] == 0) {// 若当前点没有走过
                map[i][j] = p;//赋值
                p++;
                while(p != map.length*map.length+1)//输出到最后一个数跳出循环转向
                    switch(f){
                    case 0:
                        if (setWay(map, i, j + 1)) {//向右走
                            return true;
                        }
                        break;
                    case 1:
                        if (setWay(map, i+1, j )) {// 向下走
                            return true;
                        }
                        break;
                    case 2:
                        if (setWay(map, i , j-1)) {// 向左走
                            return true;
                        } 
                        break;
                    case 3:
                         if (setWay(map, i-1, j)) {// 向上走
                                return true;
                            }
                        break;
                    }
            }
            f = (f+1)%4;//循环转向
            t++;
            return false;
    }

阅读 363发布于 6月23日
推荐阅读
目录