標籤:
無意間在網上看到了一個面試題是,寫出一個回形矩陣。實現的效果大致如下:
[ 1, 2, 3, 4, 5]
[16, 17, 18, 19, 6]
[15, 24, 25, 20, 7]
[14, 23, 22, 21, 8]
[13, 12, 11, 10, 9]
因為日常都是使用Python,剛開始覺得使用list的append方法就可以做出來,動手一下發現還是不行的。後來,覺得應該先根據參數容量製作一個list,用list的替換方法來做替換。處理的過程中,還是發現有很多思維斷掉的地方。
最後,在別人的部落格上看到2004年,有人用Python實現了逆時鐘方向的回形矩陣。借鑒了一下他的方法。大致的思路是這樣的:
第0步:回形矩陣的特點是什嗎?
順時鐘回形矩陣,在等差值為1的情況下,按照一個回形為一層的情況來看:
推導的前三條矩陣邊上的 “結束值” - “起始值” = “矩陣邊長”-1,第四條矩陣邊的 "結束值" 為 該層的起始值。
[ 1, 2, 3, 4, 5]
[16, , , , 6]
[15, , , , 7]
[14, , , , 8]
[13,12,11,10,9]
第一步,根據設定的矩陣邊長,產生一個二維數組(C語言中這麼描述,Python就是list裡面嵌套list)
1 for i in range(size):2 arry.append(range(size))
第二步,按照矩陣邊長產生該層的資料池:
1 while size >0 :2 create pool()3 layer += 1 4 size -= 2
最終代碼:
1 #!/usr/bin/env python 2 # coding: utf-8 3 4 5 def draw_matrix(begin, size, layer, arry, controlle_num): 6 # 以順時鐘方向建立遞增矩陣,按照層級 7 # 根據遞增1的特點,建立當前層的上下左右,四個list,形成資源集區 8 # 每個方向list的長度都等於size的長度 9 # [1,2,3]10 # [8, ,4]11 # [7,6,5]12 top = range(begin, begin+size)13 right = range(begin+size-1, begin+size*2-1)14 bottom = range(begin+size*2-2, begin+size*3-2)15 left = range(begin+size*3-3, begin+size*4-3)16 left[size-1] = begin # 順時鐘的左list最後一個值改為起始值17 18 # size相當矩陣的邊長,i既可以表示長,也可以表示寬19 # 通過i步進來從本層的資源集區裡面取得各個值20 for i in range(size):21 arry[layer][layer+i] = top[i] 22 arry[layer+i][controlle_num-layer-1] = right[i]23 arry[controlle_num-layer-1][controlle_num-layer-i-1] = bottom[i]24 arry[controlle_num-1-layer-i][layer] = left[i]25 return arry26 27 28 def Matrix(size, begin=1, layer=0):29 controlle_num = size30 arry = []31 for i in range(size):32 arry.append(range(size))33 while size > 0:34 arry = draw_matrix(begin, size, layer, arry, controlle_num)35 begin = begin+(4*(size-1))36 size = size - 237 layer = layer + 138 return arry39 40 41 if __name__ == ‘__main__‘:42 dat = Matrix(5)43 for i in range(5):44 print dat[i]
Python實現順時鐘回形矩陣