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