二維數組的旋轉賦值(遞歸)

描述數組

給定一個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;
    }
相關文章
相關標籤/搜索