ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

顺时针打印矩阵

2021-09-14 23:36:00  阅读:183  来源: 互联网

标签:begin 顺时针 end int 打印 矩阵 flag col row


顺时针打印矩阵

问题描述

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

标签:begin,顺时针,end,int,打印,矩阵,flag,col,row
来源: https://www.cnblogs.com/studentWangqy/p/15270247.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有