Заполнение матрицы по спирали в Python

Задача:

Выведите таблицу размером n×n, заполненную числами от 1 до n2 по спирали, выходящей из левого верхнего угла и закрученной по часовой стрелке.

Решение:

Первая строка матрицы заполняется отдельно. Далее запускается цикл, состоящий из четырех блоков с циклами for (вниз, влево, вверх, вправо). Для хранения последней заполненной ячейки используются переменные j и i (номер строки и столбца). Направление — уменьшение или увеличение на 1 значения i или j. Количество шагов в нужном направлении контролируется при помощи переменной n (изначально в нее заносится размер матрицы). После завершения четырех блоков (полный виток), от n просто отнимается 2 и весь цикл запускается сначала, что позволяет перейти и заполнить нужный внутренний виток. Условие выхода из цикла — счетчик заполненных ячеек (переменная count) становится равным количеству ячеек в матрице.

Составление таблицы, представленной ниже, помогло составить универсальный алгоритм движения по виткам матрицы произвольного размера (в основе только переменная n)

Визуализация движения по виткам матрицы

Код на Python:



n = int(input())  # размер матрицы
a = [[0] * n for i in range(n)]  # создание матрицы нужного размера, заполнена 0
count = 0  # количество заполненных ячеек  
for i in range(n):   # заполнение 1 строки
    count += 1
    a[0][i] = count
j = 0   # указываем последнюю заполненную ячейку
i = n-1
n -= 1  # устанавливаем размер 1 блока 1 витка
while len(a)**2 != count:  #условие выхода из цикла
    for k in range(n):  #движение вниз
        j += 1
        count += 1
        a[j][i] = count  # заполнение матрицы
    for k in range(n):  #движение влево
        i -= 1
        count += 1
        a[j][i] = count   
    for k in range(n-1):  #движение вверх
        j -= 1
        count += 1
        a[j][i] = count
    for k in range(n-1): #движение вправо
        i += 1
        count += 1
        a[j][i] = count
    n -= 2    # обеспечиваем переход на внутренний виток
for i in range(len(a)):  #вывод полученной матрицы
    for j in range(len(a[i])):
        print(a[i][j], end=' ')
    print()


Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: