Задача:
Выведите таблицу размером 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()