我是靠谱客的博主 疯狂狗,这篇文章主要介绍Python 解螺旋数组,现在分享给大家,希望可以做个参考。

N 为 4 的螺旋数组如图所示:

1185740-20170627221350399-1244736265.png

输入一个正整数 N,输出以 N 为边长的螺旋矩阵。(比如上图就是 N 为 4 的结果)

分析:

1、由图可知,螺旋数组的运动方向依次 右--> 下 --> 左 --> 上 --> 右 这样的循环,在合适的条件下变换累加方向即可。

2、 1 中变换方向的条件有两个,一是遇到数组边界;二是下一位置被其他数占据,比如 数字 12 的下一位 13, 按照 上 运动方向来说,13 会填在 1 的位置,但 1 这个位置已经被占据,所以得变换方向。

明白以上主要的两点就有了解题的方向。接下来探讨一些细节:

3、 方向的变换可以用 python 中的 % (求余) 循环实现,记录 4 个方向 derections,同时记录一个变量 mark ,随着 mark 的自增,(mark % 4) 的值为 [0,1,2,3,0,1,2,3...] 循环,这样达到循环获取方向的目的

复制代码
1
2
3
4
5
6
7
8
9
10
def derection(self, mark): around = [ [self.row, self.col+1], [self.row+1, self.col], [self.row, self.col-1], [self.row-1, self.col] ] return around[mark%4]

4、寻找下一个位置,已知当前的位置与当前的方向,获取下一个位置,并判断是否变换方向。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 针对目前位置,获取下一位置的 行列 数 # 下一位置为边界则更换方向 # 下一位置已经有元素则更换方向 def next(self): # 下一位置 i = self.derection(mark=self.mark) # 判断是否更换方向,不更换则更新 self.row / self.col if -1 not in i and self.max_row not in i: if self.matrix[i[0]][i[1]] is None: self.row,self.col = i return None # 更换方向 self.mark += 1 return self.next()
完整代码:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# coding=utf-8 ''' 今天这题,看起来挺简单,实际写出来并不容易。在以前公司我曾把它做过招聘的笔试题,结果惨不忍睹,不得不拿掉。 输出如图的螺旋矩阵: 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 附加题: 输入一个正整数 N,输出以 N 为边长的螺旋矩阵。(比如上图就是 N 为 4 的结果) ''' class Spiral: def __init__(self, N): self.matrix = [[None for i in range(N)] for j in range(N)] self.row = 0 self.col = 0 self.max_row = N self.mark = 0 # 按需取出对应方向 def derection(self, mark): around = [ [self.row, self.col+1], [self.row+1, self.col], [self.row, self.col-1], [self.row-1, self.col] ] return around[mark%4] # 针对目前位置,获取下一位置的 行列 数 # 下一位置为边界则更换方向 # 下一位置已经有元素则更换方向 def next(self): # 下一位置 i = self.derection(mark=self.mark) # 判断是否更换方向,不更换则更新 self.row / self.col if -1 not in i and self.max_row not in i: if self.matrix[i[0]][i[1]] is None: self.row,self.col = i return None # 更换方向 self.mark += 1 return self.next() def solution(self): # 逐一取出 1 到 n^2 值 for i in range(1,self.max_row**2+1): # 按行列赋值 self.matrix[self.row][self.col] = i # 退出条件 if i == self.max_row**2: break # 更新行列值 self.next() # 打印结果 for r in self.matrix: for c in r: print('{0:^{1}}'.format(c,self.max_row), end=' ') print('n') s = Spiral(10) s.solution()

转载于:https://www.cnblogs.com/zx576/p/7087408.html

最后

以上就是疯狂狗最近收集整理的关于Python 解螺旋数组的全部内容,更多相关Python内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(69)

评论列表共有 0 条评论

立即
投稿
返回
顶部