编程题:顺时针打印矩阵

题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.

思路:其实就是采用递归,所谓的顺时针就像围着矩阵转圈圈,先读取第一行数据,之后读最右边列的数据,再读最下行的数据,再读回最左边列的数据,读了一圈,还有数据就再按照这样方式把数据读完。


代码:



/**
 * Created by ASUS on 2018/6/1
 *
 * @Authod Grey Wolf
 */


import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Test2 {


    public static void main(String[] args) {
        Test2 test2 = new Test2();
        test2.sys1();

    }

    /**
     * 输入矩阵
     */
    private void sys1() {
        Scanner scanner=new Scanner(System.in);
        int n=scanner.nextInt();
        int m=scanner.nextInt();
        int [][]matrix=new int[n][m];
        int i,j;
        for(i=0;i<n;i++){
            for (j=0;j<m;j++){
                matrix[i][j]=scanner.nextInt();
            }
        }
        List<Integer> list=printMatrix(matrix);
        for (Integer integer:list){
            System.out.print(integer+" ");
        }

    }

    /**
     * 处理矩阵输出的顺序
     * @param matrix
     * @return
     */
    private List<Integer> printMatrix(int[][] matrix) {
        List<Integer>list=new ArrayList<>();
        read(matrix,list,0);
        return list;
    }

    /**
     * 采用递归按顺时针读取矩阵的值
     * @param matrix
     * @param list
     * @param start
     */
    private void read(int[][] matrix, List<Integer> list, int start) {
        int row=matrix.length;
        int col=matrix[0].length;
        if(matrix==null||row<1||col<1||start<0){
            return;
        }
        if(col<=2*start||row<=2*start){
            return;
        }
        //矩阵一圈中最右列在坐标中的位置
        int stopX=col-1-start;
        //一圈中最大行在坐标中的位置
        int stopY=row-1-start;
        int i;
        //打印此圈中的最上行
        for(i=start;i<=stopX;i++){
            list.add(matrix[start][i]);
        }
        //打印此圈中的最右列,此圈中至少有一列
        if(start<=stopX){
            for (i=start+1;i<=stopY;i++){
                list.add(matrix[i][stopX]);
            }
        }
        //打印此圈中的最下行
        if(start<stopX&&start<stopY){
            for(i=stopX-1;i>=start;i--){
                list.add(matrix[stopY][i]);
            }
        }
        //打印此圈中的最左列
        if(start<stopX&&start<stopY-1){
            for (i=stopY-1;i>=start+1;i--){
                list.add(matrix[i][start]);
            }
        }
        //递归打印下一圈
        read(matrix,list,start+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

Process finished with exit code 0


我的座右铭:不会,我可以学;落后,我可以追赶;跌倒,我可以站起来;我一定行。

猜你喜欢

转载自blog.csdn.net/weixin_39220472/article/details/80541109