一、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]]

 

 

posted on 2020-09-27 23:53  Luaser  阅读(628)  评论(0编辑  收藏  举报