Skip to content

Latest commit

 

History

History
95 lines (83 loc) · 3.05 KB

59 螺旋矩阵II.md

File metadata and controls

95 lines (83 loc) · 3.05 KB

59 螺旋矩阵II

一、题目

给定一个正整数n,生成一个包含1到n^2所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

  • 示例:
输入: 3
输出:
[
 [ 1, 2, 3 ],
 [ 8, 9, 4 ],
 [ 7, 6, 5 ]
]

二、Python3程序

# -*- coding:utf-8 -*-
# &Author  AnFany

# 59_Spiral_Matrix_II 螺旋矩阵II


class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        # 也就是按照右、下、左、上的方向循环放置数字
        # 首先新建二维列表,如下形式建立,不可以用[list(range(n)]*n的形式,是为了防止赋值出现错误
        spiral_matrix = [[0 for i in range(n)] for i in range(n)]
        # 继续填充的标识
        fill_sign = 1
        # 填充的第一个数
        fill_numer = 1
        # 开始填充的位置
        c, l = 0, 0
        # 已经填充的位置
        fill_dict = {}

        while fill_sign:
            fill_sign = 0
            # 首先向右填充
            while l < n and (c, l) not in fill_dict :
                spiral_matrix[c][l] = fill_numer  # 填充数
                fill_numer += 1  # 数加1
                fill_sign = 1  # 填充标识符号
                fill_dict[(c, l)] = 0
                l += 1  # 列索引加1
            if not fill_sign:  # 只要不能填充,就说明填充完毕
                break
            # 此时行要加1,列减去刚才循环中加的1
            c += 1
            l -= 1

            # 然后向下填充
            while c < n and (c, l) not in fill_dict :
                spiral_matrix[c][l] = fill_numer  # 填充数
                fill_numer += 1  # 数加1
                fill_sign = 1  # 填充标识符号
                fill_dict[(c, l)] = 0
                c += 1  # 行索引加1
            if not fill_sign:  # 只要不能填充,就说明填充完毕
                break
            # 此时列要减1,行减去刚才循环中加的1
            l -= 1
            c -= 1

            # 然后向左填充
            while l >= 0 and (c, l) not in fill_dict :
                spiral_matrix[c][l] = fill_numer  # 填充数
                fill_numer += 1  # 数加1
                fill_sign = 1  # 填充标识符号
                fill_dict[(c, l)] = 0
                l -= 1  # 列索引减1
            if not fill_sign:  # 只要不能填充,就说明填充完毕
                break
            # 此时行要减1,列加上刚才循环中减的1
            c -= 1
            l += 1

            # 然后向上填充
            while c >= 0 and (c, l) not in fill_dict:
                spiral_matrix[c][l] = fill_numer  # 填充数
                fill_numer += 1  # 数加1
                fill_sign = 1  # 填充标识符号
                fill_dict[(c, l)] = 0
                c -= 1  # 行索引减1
            if not fill_sign:  # 只要不能填充,就说明填充完毕
                break
            # 此时列要加1,行加上刚才循环中减的1
            l += 1
            c += 1

        return spiral_matrix