今天这一题是“贪吃蛇”:
给定一个NxN矩阵,从[0][0]开始沿顺时针方向遍历所有元素。如:
1 2 3
8 9 4
7 6 5
这样一个矩阵,最终的遍历打印输出为 1 2 3 4 5 6 7 8 9。
如何做到呢?
这个遍历其实是不断打印某个矩阵的四条边。老老实实的研究出各条边的起止index规律然后打印出来诚然可以,但是还有一个更简单的方法:
继续观察:
1. 打印第一条边 1 2 3,实际上是原始矩阵的第一行。
2. 接下来打印的第二条边 4 5, 是矩阵:
4 5
9 6
8 7
的第一行。而这个矩阵,是去掉第一条边后剩下的矩阵:
8 9 4
7 6 5
的转置矩阵的按行倒序。
3. 第三条边 6 7,是矩阵:
6 7
9 8
的第一行。这个矩阵,又是去掉第二条边后剩下的矩阵:
9 6
8 7
的转置矩阵的按行倒序。
4. 依次类推…
实现要点:
1. 去掉多维矩阵的第一行:
用list.pop()。
2. 矩阵的转置:
用zip(*原矩阵)。
3. 矩阵的按行倒序:
用list.reverse()。
相应的代码为:
def snail(array): a = [] while array: a.extend(list(array.pop(0))) array = zip(*array) array.reverse() return a
zip和list真是矩阵处理的好帮手。
时间: 2024-10-17 18:31:16