c++-顺时针打印矩阵

对于一个矩阵,请设计一个算法从左上角(mat[0][0])开始,顺时针打印矩阵元素。

给定int矩阵mat,以及它的维数nxm,请返回一个数组,数组中的元素为矩阵元素的顺时针输出。

测试样例:
[[1,2],[3,4]],2,2
返回:[1,2,4,3]

题意如下图所示:



顺时针,首先遍历最外面一层,1,2,3,4,7,10,4,3,2,1,7,4

然后遍历里面一层:5,6,9,8


因此解题思路就是将数据从外层向里层层层遍历,要注意判定条件


class Printer {
public:
    vector<int> clockwisePrint(vector<vector<int> > mat, int n, int m) {
        // write code here
        vector<int> res;
        
        int i=0; //行
        int y=0; //列
        while(i<=n/2 && y<=m/2) {
            int p=i;
        while(p<=n-i-1 && y<=m-y-1){
            if(p==i)
                for(int j=i;j<m-i;j++)
                    res.push_back(mat[p][j]);
            else if(p==n-1-i){
                for (int j=m-i-1;j>=i;j--)
                    res.push_back(mat[p][j]);
                if (m-1-i!=i){
                for (int x=n-i-2;x>=i+1;x--)
                    res.push_back(mat[x][i]);
                }
            }
                
            else{
                res.push_back(mat[p][m-1-i]);
            }
            p++;
        }
            i++;
            y++;
        }
        
        return res;
    }
};


第一个while是判断进行多少层遍历,相当于将矩阵进行折叠。要注意,同时判断行和列

第二个while则是在一层中进行遍历,while中的条件是对层数进行限定。


第一个if是对第一行进行遍历

           if(p==i)
                for(int j=i;j<m-i;j++)
                    res.push_back(mat[p][j]);


第二个if对最后一行进行遍历,然后再往上遍历,也就是反L型遍历

            else if(p==n-1-i){
                for (int j=m-i-1;j>=i;j--)
                    res.push_back(mat[p][j]);
                if (m-1-i!=i){
                for (int x=n-i-2;x>=i+1;x--)
                    res.push_back(mat[x][i]);
                }
            }

中间的if(m-1-i!=i)表示如果这一层只有一列时,就不会再往上遍历。


第三个else是对第一行和最后一行之间进行遍历

else{
                res.push_back(mat[p][m-1-i]);
            }






posted on 2017-12-13 17:00  sichenzhao  阅读(424)  评论(0编辑  收藏  举报

导航