剑指offer——顺时针打印矩阵

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

思路:该问题最直接的思路即按照矩阵几何上的分布进行数值的遍历,即按照顺时针的顺序依次遍历,到达一个顶点则转弯。

特殊情况:首先判断是否是单行或者单列矩阵,如果是这种情况,则直接进行矩阵的输出。

 1 import java.util.ArrayList;
 2 public class Solution {
 3     ArrayList a = new ArrayList();//新建数组,便于存储结果
 4     public ArrayList<Integer> printMatrix(int [][] matrix) {        
 5         int tR = 0;
 6         int tC = 0;
 7         int dR = matrix.length - 1;//行数
 8         int dC = matrix[0].length - 1;//列数
 9         while(tR<=dR&&tC<=dC)
10             print(matrix,tR++,tC++,dR--,dC--);
11         return a;
12     }
13     public void print(int[][] m,int tR,int tC,int dR,int dC){
14         if(dR==tR){//只有一横行,打印即可
15             for(int i = tC;i<=dC;i++){
16                 a.add(m[tR][i]);
17             }
18         }
19         else if(dC == tC){
20             for(int i = tR;i<=dR;i++ ){
21                 a.add(m[i][tC]);
22             }
23         }
24         else{
25             int curC = tC;
26             int curR = tR;
27             while(curC!=dC){//当前未到达最右端
28                 a.add(m[tR][curC++]);                
29             }
30             while(curR!=dR){//当前未到达最底端
31                 a.add(m[curR++][dC]);                
32             }
33             while(curC!=tC){//当前未到达最左端
34                 a.add(m[dR][curC--]);                
35             }
36             while(curR!=tR){//当前未到达最上端
37                 a.add(m[curR--][tC]);                
38             }
39         }
40     }
41 }
原文地址:https://www.cnblogs.com/10081-AA/p/10725639.html