顺时针打印矩阵

本文介绍了一种按顺时针方向打印矩阵元素的算法实现。通过定义边界和循环遍历的方式,确保矩阵中的每个元素都能按照指定路径被正确打印。适用于不同大小的矩阵。

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

  1 /*
  2     顺时针打印矩阵
  3     输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:输入如下矩阵:
  4     1   2   3   4
  5     5   6   7   8
  6     9   10  11  12
  7     13  14  15  16
  8     则依次打印出数字1、2、3、4、8、12、16、15、14、13、9、5、6、7、11、10
  9     由于是以外圈到内圈的顺序依次打印,我们可以把矩阵想象成若干个圈,如图所示,我们可以用一个循环来打印矩阵,每一次打印矩阵中的一个圈。
 10     接下来分析循环结束的条件。假设这个矩阵的行数是rows,列数是columns。打印第一圈的左上角的坐标是(0,0),第二圈的左上角的坐标是(1,1),依次类推。我们注意到,左上角的坐标中行标和列标总是相同的,于是可以在矩阵>    中选取左上角为(start,start)的一圈作为我们分析的目标、
 11     对于一个5*5的矩阵而言,最后一圈只有一个数字,对应的坐标为(2,2)。我们发现5>2*2。对于一个6*6的矩阵而言,最后一圈有4个数字,其左上角的坐标任然是(2,2)。我们发现6>2*2依然成立,。于是我们可以得出,让循环继续>    的条件是columns>startX*2并且rows>startY*2。
 12

 13 */

 15 void PrintMatrixClockwisely(int** numbers,int columns,int rows)
 16 {
 17     if(numbers == NULL || columns <= 0 || rows <= 0)
 18         return;
 19
 20     int start = 0;
 21
 22     while(columns > start*2 && rows > start*2)
 23     {
 24         PrinMatrixInCircle(numbers,columns,rows,start);
 25         ++start;
 26     }
 27 }
 28
 29 /*
 30     仔细分析打印每一步的条件,第一步总是需要的,因为打印一圈至少有一步。如果只有一行,那么就不用第二步了。
 31     也就是需要第二步的前提条件是终止行号大于起始行号。需要第三步打印的前提条件圈内至少有两行两列,也就是说除了要求终止行号大于起始行号之外,还要求终止列号大于起始列号。同理,需要打印出第四步的前提条件是至少
    有三行两列,因此要求终止行号比起始行号至少大2,同时终止列号大于起始列号。
 32 */
 33
 34 void PrinMatrixInCircle(int** numbers,int columns,int rows,int start)
 35 {
 36     int endX = columns-1-start;
 37     int endY = rows-1-start;
 38
 39     for(int i = start; i <= endX; ++i)
 40     {
 41         int number = numbers[start][i];
 42         printNumber(number);
 43     }
 44
 45     if(start < endY)
 46     {
 47         for(int i = start + 1; i <= endY; ++i)
 48         {
 49             int number = numbers[i][endX];
 50             printNumber(number);
 51         }
 52     }
 53
 54     if(start < endX && start < endY)
 55     {
 56         for(int i = endX - 1; i >= start; --i)
 57         {
 58             int number = numbers[endY][i];
 59             printNumber(number);
 60         }
 61     }
 62
 63     if(start < endX && start < endY - 1)
 64     {
 65         for(int i = endY - 1; i >= start + 1; --i)
 66         {
 67             int number = numbers[i][start];
 68             printNumber(numbers);
 69         }
 70     }
 71 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值