Проблема с печатью списка спиралей в python

У меня проблема со списком по спирали. Программа должна вывести таблицу размером n × n, заполненную числами от 1 до n * n по спирали, идущей из верхнего левого угла по часовой стрелке, как показано в примере (здесь n = 5).

enter image description here

Он работает, когда n четно, и не работает, когда n нечетно

n = int(input())
arr = [[0 for i in range(n)] for j in range(n)]
stop = 0
start = 0
elem = 1
while elem <= n*n:
    stop += 1
    for j in range(start, n-stop):
        i = start
        arr[i][j] = elem
        elem += 1
    for i in range(start, n-stop):
        j = n-stop
        arr[i][j] = elem
        elem += 1
    for j in range(n-stop, start, -1):
        i = n-stop
        arr[i][j] = elem
        elem += 1
    for i in range(n-stop, start, -1):
        j = start
        arr[i][j] = elem
        elem += 1
    start += 1
for i in range(len(arr)):
    for j in range(len(arr)):
        print(arr[i][j], end=' ')
    print()

Помогите пожалуйста, где тут может быть проблема?

1
0
440
2

Ответы 2

Лучшим способом будет import pdb и пошаговое выполнение вашей программы с помощью отладчика. Вместо этого я просто добавил несколько дополнительных операторов печати:

n = 5
arr = [[0 for i in range(n)] for j in range(n)]
stop = 0
start = 0
elem = 1
count = 0
while elem <= n*n:
    stop += 1
    for j in range(start, n-stop):
        i = start
        arr[i][j] = elem
        print('a')
        elem += 1
    for i in range(start, n-stop):
        j = n-stop
        arr[i][j] = elem
        print('b')
        elem += 1
    for j in range(n-stop, start, -1):
        i = n-stop
        arr[i][j] = elem
        print('c')
        elem += 1
    for i in range(n-stop, start, -1):
        j = start
        arr[i][j] = elem
        print('d')
        elem += 1
    print('e')
    count +=1
    if count > 50:
        break
    start += 1
for i in range(len(arr)):
    for j in range(len(arr)):
        print(arr[i][j], end=' ')
    print()

Вот результат, который я получил:

a
a
a
a
b
b
b
b
c
c
c
c
d
d
d
d
e
a
a
b
b
c
c
d
d
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
e
1 2 3 4 5 
16 17 18 19 6 
15 24 0 20 7 
14 23 22 21 8 
13 12 11 10 9 

Похоже, что что-то из-за нечетных значений n позволяет завершить каждый цикл for, но elem не увеличивается в достаточной степени, поэтому ваш цикл while работает вечно.

Это похоже на домашнее задание или вызов по кодированию, поэтому я не собираюсь слишком углубляться в Почему, но надеюсь, что дал вам подсказку.

Вы можете использовать numpy:

import numpy as np

def spiral(n=5):
        a = np.arange(n*n)
        b = a.reshape((n,n))
        m = None
        for i in range(n, 0, -2):
            m = np.r_[m, b[0, :], b[1:, -1], b[-1, :-1][::-1], b[1:-1, 0][::-1]]
            b = b[1:-1, 1:-1]
        a[list(m[1:])]=list(a)  
        return a.reshape((n,n)) + 1
spiral()
array([[ 1,  2,  3,  4,  5],
       [16, 17, 18, 19,  6],
       [15, 24, 25, 20,  7],
       [14, 23, 22, 21,  8],
       [13, 12, 11, 10,  9]])
spiral(10)
array([[  1,   2,   3,   4,   5,   6,   7,   8,   9,  10],
       [ 36,  37,  38,  39,  40,  41,  42,  43,  44,  11],
       [ 35,  64,  65,  66,  67,  68,  69,  70,  45,  12],
       [ 34,  63,  84,  85,  86,  87,  88,  71,  46,  13],
       [ 33,  62,  83,  96,  97,  98,  89,  72,  47,  14],
       [ 32,  61,  82,  95, 100,  99,  90,  73,  48,  15],
       [ 31,  60,  81,  94,  93,  92,  91,  74,  49,  16],
       [ 30,  59,  80,  79,  78,  77,  76,  75,  50,  17],
       [ 29,  58,  57,  56,  55,  54,  53,  52,  51,  18],
       [ 28,  27,  26,  25,  24,  23,  22,  21,  20,  19]])

Другие вопросы по теме