数据结构老师给我们布置了蛇形矩阵的题目,这让我想到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])
下面在给个测试图片吧
以上就是小白的分享,希望对大家有所帮助,不当之处还请指点