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]);
            }






  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值