Нужна помощь с разбором механизма решения задачи.(Спираль)
Требуется вывести квадрат, состоящий из N×N клеток, заполненных числами от 1 до N2 по спирали. (Решение снизу). Мне необходимо понять то, что именно обозначают строки, которые закомментированы как "# - что происходит здесь?" - Я запринтовал отдельно каждый цикл и понимаю, какие именно числа выводят циклы и в каком порядке, но не понимаю - почему именно они так делают. Также ни один из циклов не выводит последнее число (например 81 при n==9), хотя код в целом его выводит.
#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)
Ответы (1 шт):
Цикл for i in range(...) используется для перебора чисел. Если между скобками один параметр - переменная i идёт от нуля до параметра-1 (особенность синтаксиса). Если передаётся 2 параметра, то i идёт от 1-го параметра до 2-го (опять же -1). Подробнее про этот цикл читайте тут.
Вызывается mat[x][y] = z - это значит, что элемент y в элементе x матрицы будет равен теперь z. Покажу на примере:
Имеется: mat=[[1, 2], [3, 4]]
Пишем: mat[0][0]=777
Получаем: mat=mat=[[777, 2], [3, 4]]
Почему пишем [0][0], а не [1][1]? Да потому что индексация элементов списка начинается с 0, а не с 1.
На этих двух примерах Вы поймёте все строки, отмеченные # - что происходит здесь?
Помог?