From LeetCode 59. Spiral Matrix II

Description

Given a positive integer n, generate an n x n matrix filled with elements from 1 to n2 in spiral order.

Solution

螺旋矩阵

Credit to Programmercarl

 def generateMatrix(self, n: int) -> List[List[int]]:
        # initial a matrix
        matrix = [[0] * n for _ in range(n)]

        left, right, up, down = 0, n - 1, 0, n - 1
        number = 1  # number we need to fill 要填充的数字

        while left < right and up < down:

            # 从左到右填充上边 from left to right, fill up part
            for x in range(left, right):
                matrix[up][x] = number
                number += 1

            # 从上到下填充右边 
            for y in range(up, down):
                matrix[y][right] = number
                number += 1

            # 从右到左填充下边
            for x in range(right, left, -1):
                matrix[down][x] = number
                number += 1

            # 从下到上填充左边
            for y in range(down, up, -1):
                matrix[y][left] = number
                number += 1

            # 缩小要填充的范围 area
            left += 1
            right -= 1
            up += 1
            down -= 1

        # 如果阶数为奇数,额外填充一次中心 if n is odd number, should fill the center square
        if n % 2:
            matrix[n // 2][n // 2] = number

        return matrix