Spiral matrix from the center, python

Help make the matrix fillings spiral out of the center. I'm already confused about these indexes. Here are my attempts to do it, but I'm clearly doing something wrong...

Input:

3

Conclusion:

7 8 9
6 1 2
5 4 3

Code:

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()

At the moment, the output looks like this:

7   8   1   
6   0   2   
5   4   3  

Where does it go wrong?

1 answers

I propose the following algorithm:

# Исходная матрица
[
    [1]
]

# Прибавляем столбец справа, для этого перебираем все строки,
# добавляя число в конец каждой (в данном случае 
# матрица содержит одну строку)
[     
    [1, 2] 
]

# Добавляем в конец матрицы новую строку
[
    [1, 2],
    [4, 3] # новая строка
]

# Прибавляем столбец слева, для этого перебираем все строки в
# в обратном порядке, вставляя число в начало каждой
[
    [6, 1, 2],
    [5, 4, 3]
]

# Вставляем в начало матрицы новую строку.
[
    [7, 8, 9], # новая строка
    [6, 1, 2],
    [5, 4, 3]
]

# И т. д.

Solution

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)
 2
Author: MiniMax, 2020-04-15 20:28:04