灵活操作多维矩阵

今天这一题是“贪吃蛇”:

给定一个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真是矩阵处理的好帮手。

posted on 2017-05-24 20:05  jennyz_2017  阅读(276)  评论(0编辑  收藏  举报

导航