蛇形矩陣


數據結構老師給我們布置了蛇形矩陣的題目,這讓我想到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])        

下面在給個測試圖片吧

以上就是小白的分享,希望對大家有所幫助,不當之處還請指點

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM