數據結構老師給我們布置了蛇形矩陣的題目,這讓我想到python中的萬能numpy庫
我們首先思考什么是蛇形矩陣,然后找規律怎么實現它
首先我們觀察下面一幅圖
不難得到他的每一副對角線的和為某些值
如圖上所示
再之還有他的行走方式
我們可以發現和的奇偶性決定着數字走向
有了這兩點呢么我們就可以利用python很容易實現這個🐍矩陣
1 import numpy as np 2 n = int(input("輸入矩陣大小")) 3 Array = np.array(range(1,n*n+1)).reshape(n,n) 4 row = 0 5 line = 0 6 count1 = 1 #計數器1用於計算蛇形矩陣填充的數 7 Max = 2*n - 2
上面這段代碼就是簡單的導庫 輸入矩陣的大小,第三行我們定義一個n*n的數組,里面的值是無所謂的。由於這個蛇形矩陣是從1開始的所以我們加個計數器count1用於下面的填充
1 for total in range(n): #line+row 的值 total 即我們上方分析的特性之一 2 if(total%2==0): #計算出這個和的奇偶性來決定數字走向 3 for row in range(total+1): 4 line = total - row 5 Array[row,line]=count1 6 count1=count1+1 7 else: #當為奇時
for line in range(total+1):
row = total -line 10 Array[i,line]=count1
count1=count1+1 11
注意這里的就關乎精髓了,我們利用for循環遍歷 上三角 !!! 注意這里是上三角,當行或者列的索引大於n呢么我們就會超出范圍報錯,所以巧妙將他們分為上三角 下三角 兩部分利用我們開頭講的特性,這里為了方便理解上面注釋我舉個例子,比如n=4,total=2,呢么 row在0,1,2遍歷,第呢么line就在2, 1, 0遍歷,然后將count1的值賦給Array[row,line],count1+1
下面else的代碼我復制過來出現點問題重新修改了一下。原理同上。
1 count2=1 #用於畫下三角矩陣 2 for total in range(n,Max+1): 3 if(total%2==0): 4 for row in range(count2,n): 5 line = total -row 6 Array[row,line]=count1 7 count1=count1+1 8 count2=count2+1 9 else: 10 for line in range(count2,n): 11 row = total - line 12 Array[row,line]=count1 13 count1=count1+1 14 count2 = count2+1
這里我們又用了一個計數器Count2 上面我們說了上三角,下三角,呢么我們下三角不能從0開始遍歷,而是從1,2,3開始(n=4)
其他部分同上哈哈哈我太懶了😜
這里我們基本完成了80%就剩下最后的輸出了,這里你也可以直接輸出,不過得到的是一個二維數組,如下圖
1 for line in range(n): 2 for row in range(n): 3 if(row+1!=n): 4 if(Array[line,row]<10): 5 print(' ',end='') #第一對單引號中有一個空格 6 print(Array[line,row],end=' ') 7 else: 8 if(Array[line,row]<10): 9 print(' ',end='') 10 print(Array[line,row])
這里使用了for循環,其中第三行判斷是否是末尾的數,如果不是呢么我們不換行,如果是就換行,這里還要注意一個點就是第5行,這里我們為什么要加個這個呢,因為我們在輸出大的數的時候我們會發現矩陣不整齊,因為個位數和十位數的長度不一樣,差多少呢?差1個空格所以我們加了個空格,這里如果你的數很大,呢么你就多加幾個if吧哈哈哈哈(個位,十位,百位。。。。)
下面給整段代碼:
1 import numpy as np 2 n = int(input("")) 3 Array = np.array(range(1,n*n+1)).reshape(n,n) 4 row = 0 5 line = 0 6 count1 = 1 #計數器1用於計算蛇形矩陣填充的數 7 Max = 2*n - 2 8 for total in range(n): 9 if(total%2==0): 10 for row in range(total+1): 11 line = total - row 12 Array[row,line]=count1 13 count1=count1+1 14 else: 15 for line in range(total+1): 16 row = total - line 17 Array[row,line]=count1 18 count1=count1+1 19 20 count2=1 #用於畫下三角矩陣 21 for total in range(n,Max+1): 22 if(total%2==0): 23 for row in range(count2,n): 24 line = total -row 25 Array[row,line]=count1 26 count1=count1+1 27 count2=count2+1 28 else: 29 for line in range(count2,n): 30 row = total - line 31 Array[row,line]=count1 32 count1=count1+1 33 count2 = count2+1 34 for line in range(n): 35 for row in range(n): 36 if(row+1!=n): 37 if(Array[line,row]<10): 38 print(' ',end='') 39 print(Array[line,row],end=' ') 40 else: 41 if(Array[line,row]<10): 42 print(' ',end='') 43 print(Array[line,row])
下面在給個測試圖片吧
以上就是小白的分享,希望對大家有所幫助,不當之處還請指點