Разбор задачи: Спиральная матрица II

Предложенный нами код решения:

 def generateSpiralMatrix(n):
    """
    Генерирует матрицу размером n x n, заполненную числами от 1 до n^2 в спиральном порядке.
    :param n: Размер матрицы (целое положительное число)
    :return: n x n матрица, заполненная числами в спиральном порядке
    """
    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

1. Инициализация матрицы

matrix = [[0] * n for _ in range(n)]

На этом этапе создается пустая матрица размером n x n, заполненная нулями. Каждая строка матрицы представлена списком из n элементов, а матрица состоит из n таких строк. Пример для n = 3:

[[0, 0, 0],
 [0, 0, 0],
 [0, 0, 0]]

2. Установка границ и начального числа

num = 1
top, bottom, left, right = 0, n - 1, 0, n - 1
  • num — это текущее число, которое будет записано в матрицу.
  • top, bottom, left, right — переменные, представляющие границы текущей области заполнения:
    • top — верхняя строка.
    • bottom — нижняя строка.
    • left — левый столбец.
    • right — правый столбец.

3. Цикл заполнения матрицы

while top <= bottom and left <= right:

Цикл выполняется до тех пор, пока верхняя граница не пересечется с нижней, а левая — с правой. Внутри цикла реализованы четыре направления заполнения.


4. Заполнение слева направо

for i in range(left, right + 1):
    matrix[top][i] = num
    num += 1
top += 1

Здесь заполняется строка сверху на текущем уровне:

  • Индексы столбцов изменяются от left до right.
  • После заполнения сдвигаем верхнюю границу вниз (top += 1).

Пример для первой итерации, если n = 3:

Заполнение: [1, 2, 3]
Матрица:    [[1, 2, 3],
             [0, 0, 0],
             [0, 0, 0]]

5. Заполнение сверху вниз

for i in range(top, bottom + 1):
    matrix[i][right] = num
    num += 1
right -= 1

Здесь заполняется последний столбец текущей области:

  • Индексы строк изменяются от top до bottom.
  • После заполнения сдвигаем правую границу влево (right -= 1).

Пример:

Заполнение: [4, 5]
Матрица:    [[1, 2, 3],
             [0, 0, 4],
             [0, 0, 5]]

6. Заполнение справа налево

if top <= bottom:
    for i in range(right, left - 1, -1):
        matrix[bottom][i] = num
        num += 1
    bottom -= 1

Здесь заполняется строка снизу на текущем уровне:

  • Индексы столбцов изменяются от right до left.
  • После заполнения сдвигаем нижнюю границу вверх (bottom -= 1).

Пример:

Заполнение: [6, 7]
Матрица:    [[1, 2, 3],
             [0, 0, 4],
             [7, 6, 5]]

7. Заполнение снизу вверх

if left <= right:
    for i in range(bottom, top - 1, -1):
        matrix[i][left] = num
        num += 1
    left += 1

Здесь заполняется первый столбец текущей области:

  • Индексы строк изменяются от bottom до top.
  • После заполнения сдвигаем левую границу вправо (left += 1).

Пример:

Заполнение: [8]
Матрица:    [[1, 2, 3],
             [8, 0, 4],
             [7, 6, 5]]

8. Продолжение цикла

Цикл продолжается, пока не будут полностью исчерпаны все границы. В последней итерации заполняется центральная ячейка:

Заполнение: [9]
Матрица:    [[1, 2, 3],
             [8, 9, 4],
             [7, 6, 5]]

Итоговое объяснение

Функция использует пошаговое сужение границ для заполнения матрицы. Каждая итерация цикла заполняет одну сторону текущего "слоя" матрицы:

  1. Слева направо (верхний ряд).
  2. Сверху вниз (правый столбец).
  3. Справа налево (нижний ряд).
  4. Снизу вверх (левый столбец).

Каждое движение уменьшает область заполнения, пока не останется центр матрицы или пока все элементы не будут размещены.

 



Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии