Спиральная матрица из центра, python
Помогите сделать заполнения матрицы спиралью из центра. Уже запуталась в этих индексах. Вот мои попытки его сделать, но я явно что-то делаю не так...
Ввод:
3
Вывод:
7 8 9
6 1 2
5 4 3
Код:
print('Input n --> ')
# 6 - квадратная спираль снаружу
n = int(input())
v = [[0] * n for i in range(n)]
m = n
i = 0
j = n - 1
value = n * n
while n != 0:
k = 0
while k < n - 1:
value -= 1
j -= 1
v[i][j] = value
k += 1
for k in range(0, n - 1):
i += 1
value -= 1
v[i][j] = value
for k in range(0, n - 1):
j += 1
value -= 1
v[i][j] = value
for k in range(0, n - 1):
i -= 1
value -= 1
v[i][j] = value
i += 1
j -= 1
if n < 2:
n = 0
else:
n = n-2
for i in range(m):
for j in range(m):
print(v[i][j], end=' ' * 3)
print()
На данный момент вывод выглядит вот так:
7 8 1
6 0 2
5 4 3
В каком месте он идёт не туда?
Ответы (1 шт):
Автор решения: MiniMax
→ Ссылка
Предлагаю следующий алгоритм:
# Исходная матрица
[
[1]
]
# Прибавляем столбец справа, для этого перебираем все строки,
# добавляя число в конец каждой (в данном случае
# матрица содержит одну строку)
[
[1, 2]
]
# Добавляем в конец матрицы новую строку
[
[1, 2],
[4, 3] # новая строка
]
# Прибавляем столбец слева, для этого перебираем все строки в
# в обратном порядке, вставляя число в начало каждой
[
[6, 1, 2],
[5, 4, 3]
]
# Вставляем в начало матрицы новую строку.
[
[7, 8, 9], # новая строка
[6, 1, 2],
[5, 4, 3]
]
# И т. д.
Решение
from pprint import pprint
def spiral_mtrx(size):
mtrx = [[1]]
num = 2
for i in range(1, size):
if i & 1:
for row in mtrx:
row.append(num)
num += 1
mtrx.append(list(range(num + i, num - 1, -1)))
num += i + 1
else:
for row in reversed(mtrx):
row.insert(0, num)
num += 1
mtrx.insert(0, list(range(num, num + i + 1)))
num += i + 1
return mtrx
n = int(input())
pprint(spiral_mtrx(n), width = 30)