nowcoder-顺时针打印矩阵-模拟魔方逆时针旋转

本文介绍了一种按顺时针方向打印矩阵中数字的方法。通过不断打印矩阵的第一行并将其余部分逆时针旋转,直到矩阵为空。该算法适用于二维数组处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

顺时针打印矩阵

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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   2   3   4
5   6   7   8
9   10  11  12  
13  14  15  16

思想

首先将第一行打印,并删除第一行

5   6   7   8
9   10  11  12
13  14  15  16

将矩阵逆时针旋转

8   12  16
7   11  15
6   10  14
5   9   13

将第一行打印,删除第一行
….
重复上述步骤,直到剩余矩阵为空。


代码

class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {
        while(!matrix.empty()){                        //判断剩余矩阵是否为空
            for(int i = 0; i < matrix[0].size(); i++){
                ans.push_back(matrix[0][i]);           //输出第一行
            }
            matrix.erase(matrix.begin());              //删除第一行
            temp = Contrarotate(matrix);               //逆时针旋转矩阵
            matrix.clear();
            matrix = temp;
        }
        return ans;
    }
    vector<vector<int> > Contrarotate(vector<vector<int> > matrix){
        vector<vector<int> > vec;                               
        if(matrix.empty())return vec;
        int m = matrix.size(), n = matrix[0].size();

        vec.resize(n);                                   //初始化旋转后的矩阵的大小
        for(int c = 0; c < vec.size(); c++){
            vec[c].resize(m);
        }

        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                vec[i][j] = matrix[j][n-1-i];            //逆时针旋转
            }
        }
        return vec;
    }
private:
vector<vector<int> > temp;
vector<int> ans;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值