1. 程式人生 > >靈活操作多維矩陣

靈活操作多維矩陣

col 轉置矩陣 extend ever 貪吃蛇 繼續 但是 while 最終

今天這一題是“貪吃蛇”:

給定一個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真是矩陣處理的好幫手。

靈活操作多維矩陣