今天偶然看見了乙個有意思的數列排序題,就嘗試著比劃了一下,確實挺有意思,蠻好玩的。特此記錄下來螺旋矩陣樣例如下:
**********====
1 2 3 4 5 6
20 21 22 23 24 7
19 32 33 34 25 8
18 31 36 35 26 9
17 30 29 28 27 10
16 15 14 13 12 11
**********====
拆分如上矩陣有:
# 6階矩陣時
**********====
1 2 3 4 5 0
0 21 22 23 0 0
0 0 33 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
**********====
0 0 0 0 0 6
0 0 0 0 24 7
0 0 0 34 25 8
0 0 0 0 26 9
0 0 0 0 0 10
0 0 0 0 0 0
**********====
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 35 0 0
0 0 29 28 27 0
0 15 14 13 12 11
**********====
0 0 0 0 0 0
20 0 0 0 0 0
19 32 0 0 0 0
18 31 36 0 0 0
17 30 0 0 0 0
16 0 0 0 0 0
**********====
如上三角的規律顯而易見:
倒三角的個數為5、3、1
且四個方位的形狀完全一致
倒三角起始個數為階數-1
因此解題思路為:
填倒三角的值
矩陣左旋轉90度,再填倒三角的值
3.1 倒三角的計算:
設:上右下左,順時針四個方位的倒三角順位標號為1,2,3,4。預設階數為de(degree),則有如下分析:
倒三角的行數如下: sn = , ln > 0}
第1圈x順位的起始位為:0 + (de-1)*(x-1)
第2圈x順位的起始位為:4*(de-1) + (de-1-2)*(x-1)
...由上規律可得:圈數由內往外從1開始以dgx為數,由順位標號為tx,取1,2,3,4。則有如下偽**:
res[de]
[de]
=//賦值矩陣座標
cylstart =
0//預設第一圈外無值則此處為零,並從第一圈開始計算
step_n = de-
1while step_n >0:
start = cylstart + l_n *
(tx-1)
//當前圈按順位偏移
for(
int bias =
0;bias < stepn;bias++
)//倒三角賦值
res[dgx]
[dgx+bias]
= start+bias
//完成一行賦值進行下一行圈偏移有
cylstart +
= step_n*
4//從定位
dgx +=1
//座標偏移至下一行
step_n -=2
//計算l_n-1
3.2 矩陣旋轉
使用numpy的部分操作完成
import numpy as np
class
flipmatrix2d
: @staticmethod
defflip180
(arr)
: new_arr = arr.reshape(arr.size)
new_arr = new_arr[::
-1] new_arr = new_arr.reshape(arr.shape)
return new_arr
@staticmethod
defflip90_left
(arr)
: new_arr = np.transpose(arr)
new_arr = new_arr[::
-1]return new_arr
@staticmethod
defflip90_right
(arr)
: new_arr = arr.reshape(arr.size)
new_arr = new_arr[::
-1] new_arr = new_arr.reshape(arr.shape)
new_arr = np.transpose(new_arr)[:
:-1]
return new_arr
3.3 完成邏輯如下
class
spirallist
:def
__init__
(self, n)
:# n為階數
self.degree = n
self.reslist = np.array(0)
# 輸出矩陣
defprintlist
(self, lx)
:for l in lx:
str=
''for x in l:
str+=
("%02d "
%x)print
(str
)print
('**********===='
)# 倒三角計算,tx為順位計數
defwriteinnabla
(self, tx)
: step_n = self.degree -
1 dgx =
0 cylstart =
0while step_n >=0:
start = cylstart + step_n *
(tx -1)
for i in
range
(step_n)
: self.reslist[dgx]
[dgx+i]
= start + i +
1 cylstart += step_n*
4 dgx +=
1 step_n -=
2# 生成螺旋矩陣
defcalspriallist
(self)
:# 生成矩陣
self.reslist = np.zeros(
(self.degree,self.degree)
, dtype=
int)
# self.printlist(self.reslist)
for s in
range(4
):# 寫入倒三角
self.writeinnabla(s+1)
# 翻轉90度
self.reslist = flipmatrix2d.flip90_left(self.reslist)
# 如為奇數則中心位共用
if self.degree %2==
1:n =
int(self.degree/2)
self.reslist[n]
[n]= self.degree*self.degree
self.printlist(self.reslist)
if __name__==
"__main__"
: tx = spirallist(7)
tx.calspriallist(
)
python實現螺旋矩陣
import numpy 使用遞迴解決 def helixmatrix matrix,x cur,y cur,number,n if n 0 print matrix return 0 if n 1 matrix x cur y cur number print matrix return 0 上f...
螺旋矩陣生成
螺旋矩陣i 按螺旋順序返回矩陣所有元素 可以模擬螺旋矩陣的路徑。初始位置是矩陣的左上角,初始方向是向右,當路徑超出界限或者進入之前訪問過的位置時,順時針旋轉,進入下乙個方向。判斷路徑是否進入之前訪問過的位置需要使用乙個與輸入矩陣大小相同的輔助矩陣visited,其中的每個元素表示該位置是否被訪問過。...
螺旋矩陣(python)
首先這類題我覺得不能想著如何去實現這個矩陣在 中,我們只需要用一些規律和代數去實現每個位置的數字即可 n,m int i for i in input split r,c int i for i in input split def abc n,m,i,j if i 1 return j if j ...