剑指offer-顺时针打印矩阵

题目描述:

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

思路:

把打印一圈分为四步,第一步从左到右打印一行,第二步从上到下打印一列,第三步从右到左打印一行,第四步从下到上打印一列。每一步我们根据起始坐标和终止坐标用一个循环就能打印出一行或者一列。

最后一圈有可能退化成只有一行、只有一列,甚至只有一个数字,因此打印这样的一圈就不再需要四步。图中 打印一圈分别只需要三步、两步甚至只有一步。

因此我们要仔细分析打印时每一步的前提条件。第一步总是需要的, 因为打印一圈至少有一步。如果只有一行,那么就不用第二步了。也就是需要 第二步的前提条件是终止行号大于起始行号。需要第三步打印的前提条件是圈内至少有两行两列,也就是说除了要求终止行号大于起始行号之外,还要求终止列号大于起始列号。同理,需要打印第四步的前提条件是至少有三行两列,因此要求终止行号比起始行号至少大 2,同时终止列号大于起始列号。

public class Test {
    
    public static void main(String[] args) {
        int[][] numbers = {{1},{2},{3}};
        Test.printMatrix(numbers);
        
    }
     public static void printMatrix(int [][] matrix) {
         // 矩阵不能为空
         if(matrix == null)
             return;
         
         int rows = matrix.length;
         int cols = matrix[0].length;
         int start = 0;  // 每一圈的起始点
         
         // 循环打印条件
         while(start * 2 < rows && start * 2 < cols) {
             printMatrixInCircle(matrix, rows, cols, start);
             start ++; 
         }
         
     }

    private static void printMatrixInCircle(int[][] matrix, int rows, int cols,
            int start) {
        int endX = rows - 1 - start;  // 终止行号
        int endY = cols - 1 - start;  // 终止列号
        
        // 从左到右打印行
        for(int i=start; i<=endY; i++) {
            System.out.print(matrix[start][i] + " ");
        }
        // 从上往下打印一列
        if(endX > start) {
            for(int i=start+1; i<=endX; i++) {
                System.out.print(matrix[i][endY] + " ");
            }
        }
        
        // 从右往左打印一行
        if(endX > start && endY > start) {
            for(int i=endY-1; i>=start; i--) { 
                System.out.print(matrix[endX][i] + " ");
            }
        }
        
        // 从下往上打印一列
        if(endX - start >= 2 && endY > start) {
            for(int i=endX-1; i>start; i--) {
                System.out.print(matrix[i][start] + " ");
            }
        }
    }    
}
原文地址:https://www.cnblogs.com/zywu/p/5775007.html