顺时针打印矩阵

来源:互联网 发布:js编程规范 编辑:程序博客网 时间:2024/05/18 13:05

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

例如:

如果输入如下矩阵: 

1 2 3 4 

56 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,2是一圈,3,4是两圈,5,6是三圈......依次类推,可以求出圈数)。

class Solution {public:    vector<int> printMatrix(vector<vector<int> > matrix) {        vector<int> temp;        int row = matrix.size();    //行数        int column = matrix[0].size();  //列数        int circle = ((row < column ? row : column) - 1) / 2 + 1; //圈数        for (int i = 0; i < circle; ++i) {            //... ...         }        return temp;    }};
        当向右打印第一圈第一行时,可以发现打印的是一整行,当打印第二圈第一行时,左右各少了两个元素,依次类推,可以发现以向右打印的方向最终打印出来的都是一个倒三角结构。于是可以写出如下代码:

for (int j = i; j < column - i; ++j) {//从左向右打印temp.push_back(matrix[i][j]);}

        依次类推,可以发现无论是从哪个方向打印,都是一个倒三角结构,于是后续打印的代码如下:

//从上往下的每一列数据for(int k=i+1;k<row-i;k++){temp.push_back(matrix[k][column-1-i]);}//从右向左的每行数据for(int m=column-i-2;(m>=i)&&(row-i-1!=i);m--){temp.push_back(matrix[row-i-1][m]);}//从下往上的每一列数据for(int n=row-i-2;(n>i)&&(column-i-1!=i);n--){temp.push_back(matrix[n][i]);}

        至此,就可以完成上述问题。

0 0