📜  门|门 IT 2005 |第 55 题(1)

📅  最后修改于: 2023-12-03 15:28:48.006000             🧑  作者: Mango

门|门 IT 2005 |第 55 题

题目描述

编写程序,生成一张 n*n 的方阵,方阵的元素为从 1 到 n^2 按顺序递增的整数,方阵从左上角元素开始,按照右、下、左、上的方向循环填写元素。

输入格式

一个整数 n,表示方阵的大小。

输出格式

一个 n*n 的方阵。

代码示例
def generate_matrix(n: int) -> List[List[int]]:
    matrix = [[0] * n for _ in range(n)]
    num = 1
    top, bottom, left, right = 0, n - 1, 0, n - 1
    while top <= bottom and left <= right:
        for i in range(left, right + 1):
            matrix[top][i] = num
            num += 1
        top += 1
        for i in range(top, bottom + 1):
            matrix[i][right] = num
            num += 1
        right -= 1
        if top <= bottom:
            for i in range(right, left - 1, -1):
                matrix[bottom][i] = num
                num += 1
            bottom -= 1
        if left <= right:
            for i in range(bottom, top - 1, -1):
                matrix[i][left] = num
                num += 1
            left += 1
    return matrix

n = int(input().strip())
matrix = generate_matrix(n)
for row in matrix:
    print(*row)
算法说明

本题使用了一种类似于“螺旋填图”的方式生成矩阵,具体来说,我们定义了 top、bottom、left、right 四个变量,初始值都为 0 或 n-1,分别表示当前填写区域上下左右的边界。接着我们沿着右、下、左、上的顺序逐个填入矩阵的元素,直到填写完整个矩阵为止。

具体来说,我们首先从左到右填写 top 行,接着从上到下填写 right 列,再从右到左填写 bottom 行,最后从下到上填写 left 列。每次填完一行或一列之后,我们将对应的边界向内收缩一个位置,继续进行填写。填写完整个矩阵之后,我们返回最终的矩阵即可。

时间复杂度:$O(n^2)$