回形打印二维数组

一、问题描述

输入两个数字 行数和列数,回形打印出一个二维数组,大小按回形的方向依次递增。

如:  输入:  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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容