蛇形矩阵


数据结构老师给我们布置了蛇形矩阵的题目,这让我想到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