一、n维蛇形矩阵构建
一、基础版的蛇形方阵,如下图所示:
思路:
我们先构建一个N*N的矩阵dp(列表),然后用0填充,初始值 value = 1,然后value += 1更新值,将value填入到每一个位置。对于上图所示,我们发现元素在每一个圈都是以顺时针打印,那么可以将每一个圈设置为一个循环。对于一个外圈,可以看到它是从左到右,从上到下,从右到左,从下到上的顺序递增值。先设置4个方向的界限,如图所示。
从左到右,此时行的下标值不变,为up值,列的下标值从 left 加到 right-1( 即for i in range(right +1) ) ,此时发生了什么事呢,我们第一行已经完成了,那么上界限up的需要往下移动一行,即 up+1,如果上界的值加到比下界的值down要大,说明此时整个表已经完成了,因此up>down 作为跳出整个填充dp的条件,即break。
从上到下,此时列的下标值不变,为right值,行的下标值从up(此时是第二行,上一步up已经+1)加到down,结束后该列(第right列)填充完成,right的值减1,如果right < left,break。
从右到左,此时行的下标值不变,为down值,列的下标值从right减到left,结束后该行(第down行)填充完成,down的值减1,如果down < up,break。
从下到上,此时列的下标值不变,为left值,行的下标值从down减到up,结束后该列(第left列)填充完成,left的值加1,如果left > right,break。
接下来第二圈是一样的,while循环就可以了。
代码:
1 N = 7 #当然,可以指定其他的维度 2 num = 7**2 3 left = 0 #左边界 4 rigth = N - 1 #右边界 5 up = 0 #上边界 6 down = N - 1 #下边界 7 value = 1 #初始值 8 9 dp = [[0]*N for _ in range(N)] 10 11 while 1: 12 for i in range(left, rigth + 1): # 从左到右 13 dp[up][i] = value 14 value += 1 15 up += 1 # 打印了这一行,上边界减一 16 if up > down: 17 break 18 19 for i in range(up, down + 1): # 从上到下 20 dp[i][rigth] = value 21 value += 1 22 rigth -= 1 23 if rigth < left: 24 break 25 26 for i in range(rigth, left - 1, -1): # 从右到左 27 dp[down][i] = value 28 value += 1 29 down -= 1 30 if down < up: 31 break 32 33 for i in range(down, up - 1, -1): # 从下到上 34 dp[i][left] = value 35 value += 1 36 left += 1 37 if left > rigth: 38 break 39 40 from numpy import * 41 print(mat(dp))
输出:
[[ 1 2 3 4 5 6 7] [24 25 26 27 28 29 8] [23 40 41 42 43 30 9] [22 39 48 49 44 31 10] [21 38 47 46 45 32 11] [20 37 36 35 34 33 12] [19 18 17 16 15 14 13]]
二、变化版
这个形状可以发现第一圈是顺时针,第二圈是逆时针,第三圈又是顺时针,这样的话,我们可以将两圈看作是一个循环,不过在赋值的时候注意下标的位置。
代码:
1 N = 7 #当然,可以指定其他的维度 2 num = 7**2 3 left = 0 #左边界 4 rigth = N - 1 #右边界 5 up = 0 #上边界 6 down = N - 1 #下边界 7 value = 1 #初始值 8 9 dp = [[0]*N for _ in range(N)] 10 11 while 1: 12 for i in range(left, rigth + 1): # 从左到右 13 dp[up][i] = value 14 value += 1 15 up += 1 # 打印了这一行,上边界减一 16 if up > down: 17 break 18 19 for i in range(up, down + 1): # 从上到下 20 dp[i][rigth] = value 21 value += 1 22 rigth -= 1 23 if rigth < left: 24 break 25 26 for i in range(rigth, left - 1, -1): # 从右到左 27 dp[down][i] = value 28 value += 1 29 down -= 1 30 if down < up: 31 break 32 33 for i in range(down, up - 1, -1): # 从下到上 34 dp[i][left] = value 35 value += 1 36 left += 1 37 if left > rigth: 38 break 39 40 for i in range(up, down + 1): # 从上到下 41 dp[i][left] = value 42 value += 1 43 left += 1 44 if rigth < left: 45 break 46 47 48 for i in range(left, rigth + 1): # 从左到右 49 dp[down][i] = value #注意此时的下标 50 value += 1 51 down -= 1 52 if up > down: 53 break 54 55 for i in range(down, up - 1, -1): # 从下到上 56 dp[i][rigth] = value 57 value += 1 58 rigth -= 1 59 if left > rigth: 60 break 61 62 for i in range(rigth, left - 1, -1): # 从右到左 63 dp[up][i] = value 64 value += 1 65 up += 1 66 if down < up: 67 break 68 69 from numpy import * 70 print(mat(dp))
输出:
#这里生成了7维的方阵,可以根据需求设定
[[ 1 2 3 4 5 6 7] [24 25 40 39 38 37 8] [23 26 41 42 43 36 9] [22 27 48 49 44 35 10] [21 28 47 46 45 34 11] [20 29 30 31 32 33 12] [19 18 17 16 15 14 13]]