Программа курса:
Разбор задачи: Спиральная матрица 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]]
Итоговое объяснение
Функция использует пошаговое сужение границ для заполнения матрицы. Каждая итерация цикла заполняет одну сторону текущего "слоя" матрицы:
- Слева направо (верхний ряд).
- Сверху вниз (правый столбец).
- Справа налево (нижний ряд).
- Снизу вверх (левый столбец).
Каждое движение уменьшает область заполнения, пока не останется центр матрицы или пока все элементы не будут размещены.