7 顺时针打印矩阵

0 引言

题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 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 抽象问题具体化

打印顺序为:

1)最外圈,一直到最里圈,一圈一圈地打印;

2)最外圈的打印顺序为:左上角到右上角,右上角到右下角,右下角到左下角,左下角到左上角   

举例1:

{1},输出{1}

举例2:

{{1,2},{3,4}},输出{1,2,4,3}

举例3:

{1,2,3,4,5},输出{1,2,3,4,5}

举例4:

{{1},{2},{3},{4},{5}},输出{1,2,3,4,5}  

2 具体问题抽象分析

 (1)外循环

圈子在往里边缩,需要直到圈子的四个边界值,分别是:

最外圈为第0圈:行坐标范围是(0,n-1),列坐标范围是(0,m-1)

里边的圈子为:已知当前为第p圈,行坐标(p,n-1-p),列坐标范围是(p,m-1-p)

(2)内循环

圈子从(p,p)点开始,一直打印到(m-1-p,n-1-p)

 分四行打印,如图所示。

1)第一行一定要打印

2)第二行打印条件:行数大于2

3)第三行打印条件:行数大于1

4)第四行打印条件:行数大于2而且列数大于1

(3)考虑特殊情况:

当矩阵行数等于0时,直接返回空向量即可

3 demo 

   vector<int> printMatrix(vector<vector<int> > matrix) {
        vector<int> myMatrix;
        myMatrix.clear();
        if(matrix.size() == 0)  // 正负性
            return myMatrix;
        int n = matrix.size();     // 行数
        int m = matrix[0].size();  // 列数
        int p = 0;           //圈数,将最外圈定义为第0圈
        int maxCircle = (float)min(n,m)/2 > (int)min(n,m)/2? (int)min(n,m)/2 
            + 1: (int)min(n,m)/2;        
        // 外循环
        for(;p < maxCircle; p ++){
            // 内循环
            // 从左上到右上,第一行  第一行是一定要打印出来的
            for(int x = p, y = p;y <=m-1-p;y++)
                myMatrix.push_back(matrix[x][y]);
            // 从右上到右下,第二行打印的条件是行数大于2  行数公式为 row = n-2*p
            if(n-2*p >2){
                for(int x = p+1, y = m-1-p; x < n-1-p;x++)
                    myMatrix.push_back(matrix[x][y]);
            }
            // 从右下到左下,第三行打印的条件是行数大于1
            if(n-2*p >1){
                for(int x = n-1-p, y = m-1-p; y>= p;y--)
                    myMatrix.push_back(matrix[x][y]);
            }
            // 从左下到左上,第四行打印的条件是行数大于2而且列数大于1
            if(n-2*p >2 && m-2*p >1){
                for(int x = n-1-p-1,y=p; x>p;x--)
                    myMatrix.push_back(matrix[x][y]);
            }                
        }
        return myMatrix;
    }

4 代码优化

posted @ 2018-11-25 22:33  十步一杀2017  阅读(227)  评论(0编辑  收藏  举报