给一个MXN的矩阵,从左上角开始,顺时针打印该矩阵

本文介绍了一种使用C++编程语言实现的顺时针打印二维矩阵的方法。通过定义边界和方向来控制打印流程,避免了死循环的问题。该算法适用于不同大小的矩阵。

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

  1. 单纯的打印矩阵我们都会。直接一个双重循环即可,但是如何从左上角开始,顺时针打印矩阵呢。我们可以设置四个变量,left,rigth,up,down分别表示当前矩阵没有打印的的边界距离,up=1.说明第一行已经打印,这样,我们向上遍历的时候,i=1的时候就可以停止了。同理,rigth,up,down也有类似的功能。代码如下:
  2. #include
    #include
    #include
    using namespace std;
    enum Dir {Up,Down,Left,Right};
    int main()
    {
    srand((unsigned)time(NULL));
    int **matrix;
    int n = 2;
    int m = 5;
    matrix = new int [n];
    for (int i = 0; i < n; i++)
    {
    matrix[i] = new int[m];
    }
    for (int i = 0; i < n; i++)
    {
    for (int j = 0; j < m; j++)
    {
    matrix[i][j] = rand() % 50;
    }
    }
    for (int i = 0; i < n; i++)
    {
    for (int j = 0; j < m; j++)
    {
    cout << matrix[i][j] << “\t”;
    }
    cout << endl;
    }
    int left = 0;
    int right = m;
    int up = 0;
    int down = n;
    Dir cur = Right;
    int istart = 0;
    int jstart = 0;
    int sum = 0;
    while (left <= right || up <= down)
    {
    if (sum == m
    n)//先这么控制,因为在N和M不相等的时候,容易导致left <= right || up <= down始终有一个条件成立,出现死循环,导致bug。通过矩阵的元素个数可以实现控制。这个限制以后在考虑怎么修改。
    {
    break;
    }
    switch (cur)
    {
    case Right:
    jstart = left;
    while (jstart < right)
    {
    cout << matrix[istart][jstart] << " ";
    sum++;
    jstart++;
    }
    jstart–;//使jstart在矩阵范围内
    up++;//更新上边界,更新打印的限制
    cur = Down;
    break;
    case Down:
    istart = up;
    while (istart < down)
    {
    cout << matrix[istart][jstart] << " ";
    sum++;
    istart++;
    }
    istart–;使istart在矩阵范围内
    right–;更新右边界,更新打印的限制
    cur = Left;
    break;
    case Left:
    jstart = right-1;
    while (jstart >= left)
    {
    cout << matrix[istart][jstart] << " ";
    sum++;
    jstart–;
    }
    jstart++;使jstart在矩阵范围内
    down–;更新下边界,更新打印的限制
    cur = Up;
    break;
    case Up:
    istart = down-1;
    while (istart >= up)
    {
    cout << matrix[istart][jstart] << " ";
    sum++;
    istart–;
    }
    istart++;使istart在矩阵范围内
    left++;更新左边界,更新打印的限制
    cur = Right;
    break;
    }
    }
    system(“pause”);
    return 0;
    }
    执行结果如下:
    在这里插入图片描述
    加了那个控制的花,可以比较好的打印结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值