Python学习:使用迭代器打印螺旋矩阵

题目展示

(问答题) 编程输出以下格式的数据。

when i=1:
1
4 5 2
3

when i=2:
1 2
8 9 10 3

7 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值