• 顺时针打印矩阵


    顺时针打印矩阵

    问题描述

    JZ19 顺时针打印矩阵

    输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵:

    [[1,2,3,4],
    [5,6,7,8],
    [9,10,11,12],
    [13,14,15,16]]
    

    则依次打印出数字

    [1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10]
    

    基本思路

    递归打印 先外后内

    使用了递归,外层打印完毕后,再进行内层打印。

    public static void print(int[][] arr,int row_begin,int row_end,int col_begin,int col_end)
    
    print(arr,row_begin+1,row_end-1,col_begin+1,col_end-1);
    

    正常例子:

    输入:

    4 4
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
    

    预期输出

    1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10
    

    递归出口

    if (row_begin>=row_end||col_begin>=col_end){
                return;
            }
    

    考虑极端例子:

    原本没有考虑到特殊情况

    image-20210914131455086

    用flag 判断本轮打印是否终止

    于是考虑到了用flag

    boolean flag_continue = true;
    for (col=col_begin,flag_continue = false;col<col_end;col++,flag_continue=true){
        newArray.add(arr[row_begin][col]);
    }
    

    如果一轮完全没有进行,那么就说明后面也不会进行了,设flag为false,结束。

    最终代码:

    import java.util.ArrayList;
    import java.util.Scanner;
    
    /**
     * 描述:给定一个数字矩阵,请设计一个算法从左上角开始顺时针打印矩阵元素;
     *
     *
     *
     * 输入描述
     * 第一行是两个数字,分别代表行数M和列数N;
     * 接下来是M行,每行N个数字,表示这个矩阵的所有元素;
     * 当读到M=-1,N=-1时,输入终止;数字间均有空格隔开。
     *
     * 输出描述
     * 请按逗号分割顺时针打印矩阵元素(注意最后一个元素末尾不要有逗号!
     * 例如输出“1,2,3”,而不是“1,2,3,”),每个矩阵输出完成后记得换行;
    
    * 测试用例:
     (1)
     2 2
     0 1
     3 2
    
    0, 1, 2, 3
    (2)
    3 3
    0 1 2
    7 8 3
    6 5 4
    
    (3)
    5 1
    1
    2
    3
    4
    5
    *
    * */
    public class Main {
        public static ArrayList<Integer> newArray;
        public static void main(String[] args) {
            int row = 0;
            int col = 0;
            Scanner scanner=new Scanner(System.in);
            row=scanner.nextInt();
            col=scanner.nextInt();
            newArray = new ArrayList<>();
            int[][] arr = new int[row][col];
            for (int i=0;i<row;i++){
                for (int j=0;j< col;j++){
                    arr[i][j] = scanner.nextInt();
                }
            }
    
            print(arr,0,row,0,col);
            int len= newArray.size();
            for (int i=0;i< len-1;i++){
                System.out.print(newArray.get(i)+",");
            }
            System.out.println(newArray.get(len-1));
        }
    
        public static void print(int[][] arr,int row_begin,int row_end,int col_begin,int col_end){
            if (row_begin>=row_end||col_begin>=col_end){
                return;
            }
            int col;
            int row;
            boolean flag_continue = true;
            for (col=col_begin,flag_continue = false;col<col_end;col++,flag_continue=true){
    //            System.out.print(arr[row_begin][col]+", ");
                newArray.add(arr[row_begin][col]);
            }
    
            if(!flag_continue)
            {
                return;
            }
            for (row=row_begin+1,col--,flag_continue=false;row<row_end;row++,flag_continue=true){
    //            System.out.print(arr[row][col]+", ");
                newArray.add(arr[row][col]);
            }
            if(!flag_continue)
            {
                return;
            }
            for (col--,row--,flag_continue=false;col>=col_begin;col--,flag_continue=true){
    //            System.out.print(arr[row][col]+", ");
                newArray.add(arr[row][col]);
            }
            if(!flag_continue)
            {
                return;
            }
            for (row--,col++;row>row_begin && col<col_end;row--){
    //            System.out.print(arr[row][col]+", ");
                newArray.add(arr[row][col]);
            }
            print(arr,row_begin+1,row_end-1,col_begin+1,col_end-1);
        }
    }
    
    

    总结

    像这类题目,不需要特殊的知识,比如像图、树、回溯问题、动态规划问题都需要特殊的方法,如果没有学过,就基本做不出。而像这类能够通过暴力方法得到,但是又很考验细心程度的题目,比较考验细心程度和编程思维。唉,其实还是自己不会图、树、回溯、动态规划,给自己找借口罢了。。。

    这类题目很俗,就是考基本的循环,考递归、考特殊情况处理、考思考问题的全面性,不考数据结构。

    再贴个奖杯,给自己打打气!加油吧。

    image-20210914131113472

  • 相关阅读:
    VMWare磁盘配置的问题终于解决了!!
    十种老板不可追随
    关于ASP无组件上传在2003下出错
    设计模式的有趣解释-追MM[转]
    "未能在给定的程序集中找到任何适合于指定的区域性(或非特定区域性)的资源"解决办法
    今天看到了DNN3.0.4,感觉挺不错的,确实有很大的改进!!!
    今天加入了博客园
    一个女孩写的经典程序!!! (转载)
    加了强名后经常出现错误“程序集清单定义与程序集引用不匹配”
    C#写一个URL编码转换GB23121的方法,然后可以取到天气预报
  • 原文地址:https://www.cnblogs.com/studentWangqy/p/15270247.html
Copyright © 2020-2023  润新知