Заполнение квадратной матрицы по спирали (Python)

Как заполнить матрицу по спирали

В этой записи я продемонстрирую заполнение квадратной матрицы по спирали на языке Python. Использован Python версии 3.6

#n - размерность матрицы n x n
#mat - результирующая матрица
#st - текущее значение-счетчик для записи в матрицу
#m - коеффициент, используемый для заполнения верхней
#матрицы последующих витков, т.к. одномерные матрицы
#следующих витков имеют меньше значений
n = int(input())
mat = [[0]*n for i in range(n)]
st, m = 1, 0

# Заранее присваиваю значение центральному элементу
# матрицы
mat[n//2][n//2]=n*n

for v in range(n//2):
    #Заполнение верхней горизонтальной матрицы
    for i in range(n-m):
        mat[v][i+v] = st
        st+=1
        #i+=1
    #Заполнение правой вертикальной матрицы    
    for i in range(v+1, n-v):
        mat[i][-v-1] = st
        st+=1
        #i+=1
    #Заполнение нижней горизонтальной матрицы
    for i in range(v+1, n-v):
        mat[-v-1][-i-1] =st
        st+=1
        #i+=1
    #Заполнение левой вертикальной матрицы
    for i in range(v+1, n-(v+1)):
        mat[-i-1][v]=st
        st+=1
        #i+=1
    #v+=1
    m+=2

#Вывод результата на экран
for i in mat:
    print(*i)

Коротко объясню, для чего нужна переменная m. Обратите внимание на результирующую матрицу при n = 5:

matrix

Начиная со значения 17 мы заполняем новый виток до значения 19. То есть, имеем всего 3 значения: 17, 18, 19.
Для этого и используется коэффициент m, чтобы заново не штудировать все 5 значений.

Заполнение квадратной матрицы по спирали (Python): 5 комментариев

  1. Уважаемый Николай!

    Никак не могу понять зачем вы делаете инкременты «i+=»1 и «v+=1», если используются «i in range» и «v in range».
    Я ни в коем случае не критикую ваш код. Просто пытаюсь разобраться как это работает, поскольку являюсь очень начинающим программистом.
    Заранее спасибо за ответ.

    1. Добрый день, Лера.
      Когда я писал алгоритм в коде сначала были конструкции i+=2 или i+=3, пока я не понял, что прибавлять единицу — это оптимальный вариант, но забыл, что цикл единицу и без меня прекрасно добавляет)
      Поэтому вы правильно заметили, i+=1 и v+=1 там не нужны.
      Они просто заставляют цикл каждый раз начинать работу «заново», просто с другим значением.
      Если планируете использовать данный алгоритм, i+=1 и v+=1 вам не нужны.

    1. В данном случае переменная v это количество витков до центральных элементов

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *