您的位置:首页 > 编程语言 > C语言/C++

顺时针打印矩阵

2016-06-18 10:45 316 查看
题目:顺时针打印矩阵

思路:在写代码前一定要考虑几种比较特殊的情况。那么这道题目的特殊情况是什么呢?

我们先写出行和列大于等于2的一般情况。即下列程序else语句中的4个while语句,那么如果只有一行或者一列呢

     
 
 
 
 
 
如果用出现上述两种情况,那么将出现错误结果,为了代码思路清晰,我现在开头位置验证是否有这种情况,而else语句则处理一般行和列大于1的情况,最后代码如下:
如有不足的地方,欢迎批评指正。

说明[starti,startj]代表矩阵的左上角节点,[endi,endj]代表右下角节点,自己画个图将程序走一遍将有助于理解。

class Solution {

public:

    vector<int> printMatrix(vector<vector<int> > matrix) {

        vector<int> res;

        if(matrix.empty()) return res;

        int row=matrix.size();

        int col=matrix[0].size();

        int starti=0,startj=0;

        int endi=row-1,endj=col-1;

        int i=0,j=0;

        while(starti<=endi&&startj<=endj){

            i=starti;

            j=startj;

            if(startj==endj){

                for(int ii=starti;ii<=endi;ii++){

                    res.push_back(matrix[ii][startj]);

                }

            }

            else if(starti==endi){

                for(int jj=startj;jj<=endj;jj++){

                    res.push_back(matrix[starti][jj]);

                }

            }

            else{

                while(j<=endj){

                res.push_back(matrix[i][j]);

                j++;

            }

            j=endj;

            i++;

            while(i<=endi){

                res.push_back(matrix[i][j]);

                i++;

            }

            i=endi;

            j--;

            while(j>=startj){

                res.push_back(matrix[i][j]);

                j--;

            }

            j=startj;

            i--;

            while(i>starti){

                res.push_back(matrix[i][j]);

                i--;

            }

            }

            starti++;endi--;startj++;endj--;

        }

        return res;

    }

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 剑指offer 矩阵