C++实现转圈打印矩阵

给定一个整型矩阵 matrix,请按照转圈的方式打印它。

1. 题目描述

例如:
   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
要求额外空间复杂度为O(1).

2. 思路分析

先打印最外圈,然后打印里面的一圈.只要设计出打印出打印正方形的四条边就行了,同时注意边界条件,即如果只有一行或者一列的条件.
在这里插入图片描述

3. 代码

#include <iostream>
#include <vector>

template<typename T>
void pirntEdage(std::vector<std::vector<T>>& my_matrix, int tR, int tC, int dR, int dC) {
    if (tR == dR) { // same rows
        for (int i = tC; i <= dC; ++i) {
            std::cout << my_matrix[tR][i] << ",";
        }
    } else if (tC == dC) {  // same colums
        for (int i = tR; i <= dR; ++i) {
            std::cout << my_matrix[i][tC] << ",";
        }
    } else {    // print 4 edges
        int curR = tR;
        int curC = tC;
        while (curC != dC) {
            std::cout << my_matrix[tR][curC] << ",";
            ++curC;
        }
        while (curR != dR) {
            std::cout << my_matrix[curR][dC] << ",";
            ++curR;
        }
        while (curC != tC) {
            std::cout << my_matrix[dR][curC] << ",";
            --curC;
        }
        while (curR != tR) {
            std::cout << my_matrix[curR][tC] << ",";
            --curR;
        }
    }
}

template<typename T>
void spiralOrderPrint(std::vector<std::vector<T>>& my_matrix) {
    int tR = 0;
    int tC = 0;
    int dR = my_matrix.size() - 1;
    int dC = my_matrix[0].size() - 1;
    while (tR <= dR && tC <= dC) {
        pirntEdage(my_matrix, tR++, tC++, dR--, dC--);
    }
}
int main()
{
    std::vector<std::vector<int>> my_matrix = {{1, 2, 3, 4},
                                              {5, 6, 7, 8},
                                              {9, 10, 11, 12},
                                              {13,14, 15, 16}};
    spiralOrderPrint(my_matrix);
    return 0;
}

在这里插入图片描述

4. 参考文献

  1. 顺时针打印矩阵——C++
  2. 【已解决】Linux下出现Segmentation Fault(core dump)错误
  3. 使用vector创建一个二维数组(一)
  4. c++中vector的用法详解
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值