纵向蛇形矩阵转换(笔记)

一、前言

我在试图使用某种开发板,通过已经给我的一些方式,控制开发板使一个 8x8 rgb 点阵灯显示特定的图案。

我注意到官方给我的 demo 中,这个点阵灯通过设置一个列表,列表长度为 64,对应点阵灯数量,点阵灯的每个 rgb 灯索引对应列表当中的索引是以蛇形排列的:

56 55 40 39 24 23  8 7
57 54 41 38 25 22  9 6
58 53 42 37 26 21 10 5
59 52 43 36 27 20 11 4
60 51 44 35 28 19 12 3
61 50 45 34 29 18 13 2
62 49 46 33 30 17 14 1
63 48 47 32 31 16 15 0

我注意到通过索引一一对应去修改对应的灯从而拼成一个图案太过于麻烦,我想通过一个 8x8 的二维列表,来将其遍历,遍历的时候采用这种蛇形的顺序来遍历。

这是我根据这个背景引发的思考,同样也适用于类似的题目。

二、题目

现有一个二维列表,大小是 8x8 。请编写一个函数,对二维列表进行遍历,要求遍历的顺序应该按照上面的蛇形方式进行遍历。

输入:

56 55 40 39 24 23  8 7
57 54 41 38 25 22  9 6
58 53 42 37 26 21 10 5
59 52 43 36 27 20 11 4
60 51 44 35 28 19 12 3
61 50 45 34 29 18 13 2
62 49 46 33 30 17 14 1
63 48 47 32 31 16 15 0

输出:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

三、解答过程

首先我对这种蛇形的规律做了分析,我注意到若从最开始的起点,写出每个元素的坐标,会发现遍历的坐标有如下规律:

先从 (7, 7) 开始,列索引不变,行索引减少到 0,变成 (7, 0) 。然后列索引减少 1,行索引从小到大继续变化到 7 为止。之后重复这一步。于是我根据规律将整个二维列表分成了四部分,每两列是一部分,因为这两列当中行索引会先减少再增大。

# 减小过程
for i in range(7, -1, -1):
    print(array[i][j], end=' ')
# 列索引减少
j -= 1

# 增大过程
for i in range(8):
    print(array[i][j], end=' ')
# 列索引减少
j -= 1

原本我想将这两个过程写成一个循环,但是忽然发现,减小过程和增大过程的开始都是同一个行索引,而一个循环很难做到形如:7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7 这样中间忽然出现两个 0 的情况,所以这部分没有做更深入的思考。

整个上面的两个过程结合成一组,这组会进行 4 次,所以有了如下代码:

j = 7
for _ in range(4):
    # 减小过程
    for i in range(7, -1, -1):
        print(array[i][j], end=' ')
    # 列索引减少
    j -= 1

    # 增大过程
    for i in range(8):
        print(array[i][j], end=' ')
    # 列索引减少
    j -= 1

同样由于 j 会在每组过程中减少 2,但是在组内会是两次减少,每次减少 1,所以很难使用 for 循环将这部分整合在一起,故并没有做深入思考

最后只需要将上面的代码封装为函数即可:

def func(array: list[list]):
    j = 7
    for _ in range(4):
        # 减小过程
        for i in range(7, -1, -1):
            print(array[i][j], end=' ')
        # 列索引减少
        j -= 1

        # 增大过程
        for i in range(8):
            print(array[i][j], end=' ')
        # 列索引减少
        j -= 1
  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虚叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值