Exercism - Python 输出螺旋矩阵

需求:

Exercism 上的1个题目,要求根据给定的 size,输出对应的螺旋矩阵。

之前一直局限在二维数组里走不出来,耽搁了有一周时间。今天在高铁上豁然开朗,要把朝向和坐标结合来做。下车后到酒店把代码写了出来。

原文地址:Spiral Matrix in Python on Exercism

实现:

# !/usr/bin/env python3
# _*_ coding:utf-8 _*_
"""
@File               : spiral_matrix.py
@Project            : Python_012_Spiral_Matrix
@CreateTime         : 2023/2/13 16:25
@Author             : biaobro
@Software           : PyCharm
@Last Modify Time   : 2023/2/13 16:25 
@Version            : 1.0
@Description        : None
"""
RIGHT = 1
DOWN = 2
LEFT = 3
UP = 0


def spiral_matrix(size):
    # 00, 01, 02, 03
    # 10, 11, 12, 13
    # 20, 21, 22, 23
    # 30, 31, 32, 33
    # Highlight: 这种写法属于浅拷贝,内部的子列表指向的是同1个地址,不论修改哪个子列表,其他列表也会跟着变化,所以是有问题的
    # res = [[0] * size] * size
    if size == 1:
        return [[1]]

    towards = RIGHT

    # Highlight: 改用这种写法,每个子列表都是新创建的
    res = [[0 for _ in range(size)] for _ in range(size)]

    x_pos = y_pos = count = 0
    # 从0开始循环
    for idx in range(size*size):
        # 从1开始赋值
        res[x_pos][y_pos] = idx+1

        # count < 3 是固定的,3个边的规律固定
        # 前3个 都是按 size 转向
        if idx % (size - 1) == 0 and idx != 0 and count < 3:
            # 4 代表4个方向,固定值
            towards = (towards + 1) % 4
            count += 1

        if towards == RIGHT:
            y_pos += 1
        elif towards == DOWN:
            x_pos += 1
        elif towards == LEFT:
            y_pos -= 1
        elif towards == UP:
            x_pos -= 1

        # 如果下一个位置 不是0 ,需要转向,同时调整(回退)x_pos, y_pos
        if res[x_pos][y_pos] != 0:
            # 转向
            towards = (towards + 1) % 4

            # 前1个方向是 up,往回退是向下x要加
            if towards == RIGHT:
                y_pos += 1
                x_pos += 1
            # 前1个方向是 RIGHT
            elif towards == DOWN:
                x_pos += 1
                y_pos -= 1
            # 前1个方向是 DOWN
            elif towards == LEFT:
                x_pos -= 1
                y_pos -= 1
            # 前1个方向是 LEFT
            elif towards == UP:
                x_pos -= 1
                y_pos += 1

    return res


print(spiral_matrix(5))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值