回形打印二維數組

一、問題描述

輸入兩個數字 行數和列數,回形打印出一個二維數組,大小按回形的方向依次遞增。

如:  輸入:  4 、5
輸出: 
0   1   2   3 
13  14  15  4
12  19  16  5
11  18  17  6
10  9   8   7

二、解題思路

順著數字的軌跡,你會發現他的打印是一層一層的,即:第一層0-13、第二層為14-19。所以這個問題我們可以將他拆分開來,采用遞歸來做。

三、實現代碼

 /**
     *
     * @param arr  數組
     * @param row  行
     * @param col  列
     * @param level 層數
     * @param count 計數
     */
    public void travel(int [][] arr, int row, int col, int level, int count) {
        //遞歸出口 
        if (row - 2 * level == 0 || col - 2 * level == 0) {
            return;
        }

        if (row - 2 * level == 1) {
            for (int i = level; i < col -level; ++i) {
                arr[level][i] = count++;
            }
            return;
        }

        if (col - 2 * level == 1) {
            for (int i = level; i < row -level; ++i) {
                arr[i][level] = count++;
            }
            return;
        }

        /**
         * 遍歷四條邊
         */
        for (int i = level; i < col - level; ++i) {
            arr[level][i] = count++;
        }

        for (int i = level + 1; i < row - 1 - level; ++i) {
            arr[i][col - 1 - level] = count++;
        }

        for (int i = col - 1 - level; i >= level; --i){
            arr[row - 1- level][i] = count++;
        }

        for (int i = row - 2 - level; i >= level+1; --i){
            arr[i][level] = count++;
        }
       // 遞歸
        travel(arr, row, col, level + 1, count);
    }


    /**
     * 打印
     * @param arr
     * @param row
     * @param col
     */
    public void print(int[][] arr, int row, int col){
        for (int i = 0; i < row; ++i){
            for (int j = 0; j < col; ++j){
                System.out.print(arr[i][j] + "    ");
            }
            System.out.println();
        }
    }

    @Test
    public void testTravel() {
        int [][] arr = new int[4][5];
        travel(arr, 4, 5, 0, 0);
        print(arr, 4, 5);
    }
輸出結果.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容