一、前言
我在试图使用某种开发板,通过已经给我的一些方式,控制开发板使一个 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