面试题20:顺时针打印矩阵

题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:如果输入以下矩阵:

1  2  3  4

5  6  7  8

9  10  11  12

13  14  15  16

则依次打印出数字1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16

 1 void printMatrixClockwisely(vector< vector<int> >&numbers)
 2 {
 3     int m = numbers.size();
 4     if ( m == 0 )
 5         return ;
 6     int n = numbers[0].size();
 7     if ( n == 0 )
 8         return ;
 9     int leftTop = 0;
10     while (leftTop*2 < m && leftTop*2 < n)
11     {
12         //打印左上角元素为numbers[leftTop][leftTop]的元素
13         int endCol = n - 1 - leftTop;
14         int endRow = m - 1 -leftTop;
15         //从左到右打印一行
16         for (int j = leftTop; j <= endCol; ++j)
17             cout << numbers[leftTop][j] << ' ';
18         //从上到下打印一行
19         if (endRow > leftTop)
20         {//注意是两行,不能是两列
21         for (int i = leftTop+1; i <= endRow; ++i)
22             cout << numbers[i][endCol]<< ' ';
23         }
24         //从右到左打印一行
25         if (endRow > leftTop && endCol > leftTop )
26         {
27             for (int j = endCol-1; j >= leftTop; --j)
28                 cout << numbers[endRow][j]<< ' ';
29         }
30         //从下到上打印一行
31         if (endRow - 1 > leftTop && endCol > leftTop)
32         {
33         for (int i = endRow-1; i > leftTop; --i)
34             cout << numbers[i][leftTop]<< ' ';
35         }
36         leftTop++;
37     }
38 }

分析:该题主要有两个需要注意的地方(选取左上角(leftTop,leftTop)的一圈为分析目标):

  • 循环终止条件。通过举例分析得出leftTop*2 < m && leftTop*2 < n为循环终止条件;
  • 打印每一步的前提条件。第一步总是需要的。而第二步要求至少有两行,第三步打印的前提条件是圈内至少有两行两列,而第四步打印则要求至少有三行两列。
原文地址:https://www.cnblogs.com/happygirl-zjj/p/4618021.html