一、基础版的蛇形方阵,如下图所示:
思路:
从左到右,从上到下,从右到左,从下到上的顺序递增值。先设置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]]