顺时针打印矩阵

题目

输入一个矩阵,按照从外向里以顺时针打印出每一个数字,例如下图矩阵

Khf43V.png

打印结果为:1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10

思路

大体思想是将矩阵由外到内一圈一圈的打印,直至所有数字都打印完毕,具体思路如下:

  • 在不考虑打印矩阵内圈的情况下,此时只需要两个点的坐标就可以遍历完整的矩阵,我们取左上角的坐标和右下角的坐标,最外圈的矩阵坐标就是(0,0)和(arr.length-1,arr[0].arr.length-1)
  • 完整打印了外圈矩阵后,只需要将左上角的坐标向右下方移动一格、右下角坐标向左上方移动一格,此时就得到了可以打印内圈矩阵的两个坐标
  • 重复执行上述步骤,直至得到的坐标无法构成矩阵为止

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package Code;


* 顺时针打印矩阵
* @author CaiRui
* @time 2019-10-24
*/
public class {

private static void printMatrix(int[][] matrix) {
//不是矩阵
if (matrix == null || matrix.length <= 1 || matrix[0].length <= 1) {
return;
}
int[] A = {0, 0};
int[] B = {matrix.length - 1, matrix[0].length -1};
while (B[0] >= A[0] && B[1] >= A[1]) {
print(matrix,A[0]++,A[1]++,B[0]--,B[1]--);
}
}


* 左上角坐标(a,b)
* 右下角坐标(c,d)
*/
private static void print(int[][] arr, int a, int b, int c, int d) {
// (a, b) -> (a, d)
int index = b;
while (index < d) {
System.out.print(arr[a][index++] + " ");
}
// (a, d) -> (c, d)
index = a;
while (index < c) {
System.out.print(arr[index++][d] + " ");
}
// (c, d) -> (c, b)
index = d;
while (index > b) {
System.out.print(arr[c][index--] + " ");
}
// (c, b) -> (a, b)
index = c;
while (index > a) {
System.out.print(arr[index--][b]+" ");
}
}

public static void main(String[] args) {
int[][] matrix = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 }, { 13, 14, 15, 16 } };
ClockwisePrintMatrix.printMatrix(matrix);
}

}