题目展示
(问答题) 编程输出以下格式的数据。
when i=1:
1
4 5 2
3when i=2:
1 2
8 9 10 37 12 11 4
6 5
拿到这道题后首先要找出输出数据的规律,不难发现,这些输出以顺时针螺旋的方式排列,且i取多少,第一行和最后一行就有几个数,中间 i 行是标准的螺旋矩阵。因此想要准确实现此题,首先需要熟悉最基本的螺旋矩阵的实现过程。
那么接下来就先整理一波螺旋矩阵的实现。
思路说明
螺旋矩阵是一个呈螺旋状的矩阵,它的数值向右->向下->向左->向上依次变大,不断循环。由于螺旋矩阵是一个循环迭代的过程,因此需要导入python模块itertools
我们用(x, y)坐标来表示螺旋矩阵的位置,顺时针方向:
右(1,0)->【x加一格】,
下(0, 1)->【y加一格】,
左(-1, 0)->【x减一格】,
上(0, -1)->【y减一格】。
坐标从(0, 0)开始,不断更新,当超过范围或者遇到障碍时改变方向。
螺旋矩阵的打印首先应该对n*n的数组进行赋值(初始化)。
代码实现
# 导入迭代器模块itertools
import itertools
# 定义spiral()函数实现螺旋矩阵
def spiral(n, m):
# 四个状态,右-下-左-上
_status = itertools.cycle(['right', 'down', 'left', 'up' ])
# 每个状态所对应的坐标变化情况
_movemap = {
'right': (1, 0), 'down': (0, 1), 'left': (-1, 0), 'up': (0, -1)}
# 初始化二维数组
pos_map = dict.fromkeys([(x, y) for x in range(n) for y in range(m)])
# 初始化开始位置
_pos = (0, 0)
# 转到下一状态
_st = next(_status)
for i in range(1, n*m+1):
_oldpos = _pos
# 更新位置
_pos = tuple(map(sum, zip(_pos, _movemap[_st])))
# 当超出维度或者遇到障碍时,改变状态
if (_pos not in pos_map) or (pos_map[_pos]):
_st = next(_status)
_pos = tuple(map(sum, zip(_oldpos, _movemap[_st])))
pos_map[_oldpos] = i
return pos_map
def display_spiral(n, m):
pos_map = spiral(n, m)
for