旋轉陣列(順時針90度,180度,270度)

2021-09-25 17:32:22 字數 3635 閱讀 2353

順時針旋轉90∘

^∘ 第一種是用座標變換法,在網上看到的一種座標變換:

順時針90∘

^∘:newarr[i][j]=arr[n-1-j][i]

順時針180∘

^∘:newarr[i][j]=arr[n-1-i][n-1-j]

順時針270∘

^∘:newarr[i][j]=arr[j][n-1-i]

第二種根據特點,先觀察matrix與轉置後的matrix與順時針旋轉90∘^∘。

原矩陣

1234

5678

9 轉置

1472583

69旋轉90∘^∘7

4185

2963

觀察可知,轉置後矩陣每行反轉即得到順時針旋轉90∘

^∘的矩陣,故可用以下**實現:

def

rotate90

(matrix)

:# 先寫最簡單的逐元素的轉置方法

n =len(matrix)

# 先轉置

for i in

range

(n):

for j in

range

(i,n)

: matrix[i]

[j],matrix[j]

[i]= matrix[j]

[i],matrix[i]

[j]# 再翻轉每一行

for i in

range

(n):

matrix[i]

.reverse(

)return matrix

第三種方法,使用函式式程式設計的方法,其實順時針旋轉90∘

^∘等價於先將原來的矩陣上下翻轉然後再轉置,逆時 針旋轉90∘

^∘等價於先將原來的矩陣轉置再上下翻轉。這個過程可以用**演示一下:

1)先上下翻轉再轉置等價於順時針旋轉90∘

^∘ 上下翻轉78

9456

123轉置

7418

5296

32) 先轉置再上下翻轉等價於逆時針旋轉90∘

^∘ 轉置14

7258

369上下翻轉36

9258

147這個其實就是逆時針旋轉90∘^∘。

既然前面講了可以通過先轉置再左右翻轉的方法實現順時針旋轉90∘

^∘,為什麼又要講這種方法呢?老實地說是因為我看到大神這麼寫,**很簡潔,就貼在這兒,加點自己的分析,23333。

好了,言歸正傳。python中矩陣是按行儲存的,所以對於二維矩陣來說,實現上下翻轉很簡單:matrix=matrix[::-1],轉置的話可以用zip(*matrix)來實現。

此處補充一下,zip(*matrix)為什麼能實現轉置,首先,假設matrix的形狀是n*m的,*matrixmatrix矩陣分解為n個長度為m的列表,然後zip依次取這些列表的各個元素構成m個長度為n的元組,故它可實現轉置。

舉個例子,matrix=[[1,2,3],[4,5,6]*matrix將其變成[1,2,3],[4,5,6]再傳給zipzip之後結果為(1,4),(2,5),(3,6)。可見實現了轉置。

具體**:

def

rotate90

(matrix)

:# matrix[:] = map(list,zip(*matrix[::-1])) # 這種方法是原地修改,會修改傳入的矩陣

matrix =

list

(map

(list

,zip

(*matrix[::

-1])

))# 這種方法不是原地修改,對原來矩陣無影響

return matrix

以上**解讀:

matrix[::-1]為將矩陣上下翻轉

zip(*matrix[::-1])中,*將翻轉矩陣解壓成n個列表,然後使用zip使這些列表變成n個分別含有各行的第1-n個元素的元組

map(list,..)使前面的結果重新變成列表

matrix=[[1,2,3],[4,5,6],[7,8,9]]為例

matrix[::-1]=[[7,8,9],[4,5,6],[1,2,3]]zip(*matrix[::-1])matrix[::-1]先解成三個列表[7,8,9],[4,5,6],[1,2,3],然後對這三個列表使用zip,生成乙個zip物件,裡面是三個元組(7,4,1),(8,5,2),(9,6,3)map(list,...)將上述三個元組變為列表,再通過list方法把它們由map物件變成列表

因此matrix = list(map(list,zip(*matrix[::-1])))得到的是順時針旋轉90∘

^∘後的矩陣

至於順時針旋轉180∘

^∘,其實就是先上下翻轉,再左右翻轉;而順時針旋轉270∘

^∘即為逆時針旋轉90∘

^∘,它們的**分別貼下:

def

rotate180

(matrix)

: n =

len(matrix)

matrix = matrix[::

-1]for i in

range

(n):

matrix[i]

=list

(reversed

(matrix[i]))

# 這一步不用matrix[i].reverse()是為了防止對原陣列的各行進行翻轉

Java實現矩陣順時針旋轉90度

實現矩陣的轉置較為容易,只需要將縱橫下標互換即可。實現矩陣旋轉稍微麻煩一點。解題思路 矩陣轉換90度,則原矩陣的縱下標轉變為新矩陣的橫下標 原矩陣的橫下標轉變為新矩陣的縱下標,並且順序相反。public class rotation public static int change int matr...

矩陣順時針轉動90度

輸入描述 輸入包含多行,第一行乙個整數n 1 n 200 代表矩陣的行數和列數,接下來n行,每行n個整數,代表矩陣matrix 1 matrix i j 40000 輸出描述 輸出旋轉後的矩陣 包含n行,每行n個數 示例1輸入 41 2 3 4 5 6 7 8 9 10 11 12 13 14 15...

將正方形矩陣順時針旋轉90度

將正方形矩陣順時針旋轉90度 給定乙個n n的矩陣matrix,請把這個矩陣順時針轉動90度。輸入描述 輸入包含多行,第一行乙個整數n 1 n 200 n 1 leq n leq 200 n 1 n 200 代表矩陣的行數和列數,接下來n行,每行n個整數,代表矩陣mat rix 1 ma trix ...