顺时针遍历矩阵

顺时针遍历二维数组。

忘了是在哪看到的这个问题,刚看到时直接懵逼了。不过其实还好吧
闲着没事干就把他给写了出来。
我们定义 上面边界 up , 下面边界down, 左边边界left, 右边边界rihgt;
然后分别 按照次序进行打印就完了。
效果如下,不过这样好像没有什么实际工程意义, 吐槽~~。
顺时针打印-2020-10-01-12-55-29
突然想起 对于未知二位数组指针,可以使用sizeof 进行做除法求取数组的长和宽。
假设arry是一个int** 类型的 二位数组指针
可以这样获取行数和列数。
行数 sizeof(arry) / sizeof(*arry)
列数 sizeof(*arry) / sizeof(int)

代码

话不多说,show me your code

#include<iostream>
using namespace std;

int main(){

    int arry[8][10] = {0};

    int x = sizeof (arry) / sizeof(*arry); // 获取行
    int y = sizeof(*arry) / sizeof(int);   // 获取列

    // 顺时针打印。 
    int left = 0, right = y - 1, up = 0, down = x - 1; // 记录 上下左右的边界。
    int cnt = 0; 
    while (left < right && up < down)
    {
        // 打印 上面边界
        for (int i = left; i <= right; i ++ ) arry[up][i] = cnt ++ ;
        up ++ ;
        // 打印 左边列。
        for (int i = up; i <= down; i ++ ) arry[i][right] = cnt ++ ;
        right -- ;
        // 打印 下边界。
        for (int i = right; i >= left; i -- ) arry[down][i] = cnt ++ ;
        down -- ;
        // 打印 右边界
        for (int i = down; i >= up; i -- ) arry[i][left] = cnt ++ ;
        left ++ ;

    }
    for (int i = 0; i < 8; i ++ ){
        for (int j = 0; j < 10; j ++ ){
            cout << arry[i][j] <<" ";
        }
        cout << endl;
    }
    system("pause");
    return 0;
}

我的博客传送门
喜欢的话,给博主赏一杯冰阔乐吧

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
首先,我们需要确定起始位置以及每个方向的边界。我们可以通过以下方法来确定: 假设矩阵的大小为n行m列,起始位置为(0,0),则可以得到每个方向的边界: 向右:(0,m-1);向下:(n-1,m-1);向左:(n-1,0);向上:(1,0) 接下来,我们需要确定k所在的方向以及在该方向上的位置。我们可以通过以下方法来确定: 假设当前方向为向右,边界坐标为(0,m-1),则k所在的方向为向右,并且k所在的位置为k-1。 如果k在向下的方向上,我们可以将起始位置向下移动一行,并将当前方向改为向下。边界坐标为(n-1,m-1)。此时,k所在的位置为k-m。 如果k在向左的方向上,我们可以将起始位置向下移动一行,并将当前方向改为向左。边界坐标为(n-1,0)。此时,k所在的位置为n×m-k+1。 如果k在向上的方向上,我们可以将起始位置向上移动一行,并将当前方向改为向上。边界坐标为(1,0)。此时,k所在的位置为n×m-2×m-k+3。 最后,我们可以将得到的坐标i和j加上起始位置的行列值即可。 下面是Python代码实现: ``` def findCoord(n, m, k): i, j = 0, 0 direction = 0 left, right, up, down = 0, m - 1, 0, n - 1 while left <= right and up <= down: if direction == 0: if k <= right: j = k i = up break else: k -= right up += 1 direction = 1 elif direction == 1: if k <= down: i = k j = right break else: k -= down right -= 1 direction = 2 elif direction == 2: if k <= right: j = k i = down break else: k -= right down -= 1 direction = 3 else: if k <= down: i = down - k + 1 j = left break else: k -= down left += 1 direction = 0 return i, j ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值