順時針旋轉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
的,*matrix
把matrix
矩陣分解為n
個長度為m
的列表,然後zip
依次取這些列表的各個元素構成m
個長度為n
的元組,故它可實現轉置。
舉個例子,matrix=[[1,2,3],[4,5,6]
,*matrix
將其變成[1,2,3],[4,5,6]
再傳給zip
,zip
之後結果為(1,4),(2,5),(3,6)
。可見實現了轉置。
具體**:
def
rotate90
(matrix)
:# matrix[:] = map(list,zip(*matrix[::-1])) # 這種方法是原地修改,會修改傳入的矩陣
matrix =
list
(map
(list
,zip
(*matrix[::
-1])
))# 這種方法不是原地修改,對原來矩陣無影響
return matrix
以上**解讀:
至於順時針旋轉180∘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∘^∘後的矩陣
^∘,其實就是先上下翻轉,再左右翻轉;而順時針旋轉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 ...