Как заполнить матрицу по спирали
В этой записи я продемонстрирую заполнение квадратной матрицы по спирали на языке 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:
Начиная со значения 17 мы заполняем новый виток до значения 19. То есть, имеем всего 3 значения: 17, 18, 19.
Для этого и используется коэффициент m, чтобы заново не штудировать все 5 значений.
Уважаемый Николай!
Никак не могу понять зачем вы делаете инкременты «i+=»1 и «v+=1», если используются «i in range» и «v in range».
Я ни в коем случае не критикую ваш код. Просто пытаюсь разобраться как это работает, поскольку являюсь очень начинающим программистом.
Заранее спасибо за ответ.
Добрый день, Лера.
Когда я писал алгоритм в коде сначала были конструкции i+=2 или i+=3, пока я не понял, что прибавлять единицу — это оптимальный вариант, но забыл, что цикл единицу и без меня прекрасно добавляет)
Поэтому вы правильно заметили, i+=1 и v+=1 там не нужны.
Они просто заставляют цикл каждый раз начинать работу «заново», просто с другим значением.
Если планируете использовать данный алгоритм, i+=1 и v+=1 вам не нужны.
Спасибо за код!!
for v in range(n//2) для чего n//2? Никак не пойму
В данном случае переменная v это количество витков до центральных элементов
Николай, объясните подробнее этот момент
Вы делаете один виток, потом другой, третий… с каждым витком их количество остается все меньше. К тому же на каждом новом витке элементов вы проходите тоже меньше.