Страницы

Поиск по вопросам

среда, 29 января 2020 г.

Помогите понять код: алгоритм генерации матрицы со спиралью

#python #алгоритм #матрицы


Не могу понять как именно работает код.Очень прошу написать комментарии к каждой
строке кода(если не затруднит),что бы понять сам алгоритм выполнения

Задача:

Выведите таблицу размером n×n, заполненную числами от 1 до n2 по спирали, выходящей
из левого верхнего угла и закрученной по часовой стрелке

Сам код:

def zm(n):
    dx, dy = 1, 0
    x, y = 0, 0
    arr = [[None] * n for _ in range(n)]
    for i in range(1, n**2+1):
        arr[x][y] = i
        nx, ny = x+dx, y+dy
        if 0 <= nx < n and 0 <= ny < n and not arr[nx][ny]:
            x, y = nx, ny
        else:
            dx, dy = -dy, dx
            x, y = x+dx, y+dy
    for x in list(zip(*arr)):
        print(*x)

zm(int(input()))

    


Ответы

Ответ 1



# Создаётся функция, которая и будет всё делать def zm(n): # Переменной dx присваивается значение 1 # Переменной dy присваивается значение 0 # Обычно dx и dy - это некие приращения для переменных x и y dx, dy = 1, 0 # Переменным x и y присваивается значение 0 x, y = 0, 0 # Создаётся список списков # Это матрица n*n # Пока все её элементы - пустые (None) arr = [[None] * n for _ in range(n)] # Выполняется перебор # Для переменной i последовательно перебираем значения от 1 до (n-квадрат + 1) for i in range(1, n**2+1): # Элементу матрицы с координатами x и y присваивается значение i # Эта строчка будет присваивать последовательные натуральные числа # тем ячейкам, которые перебирает код чуть ниже arr[x][y] = i # Создаются временные переменные nx и ny # в которых вычисляются новые значения для x и y # для этого к старым значенииям прибавляются приращения nx, ny = x+dx, y+dy # Если всё нормально, и индекс не выскочил за пределы матрицы # или не наткнулся на уже занятую ячейку if 0 <= nx < n and 0 <= ny < n and not arr[nx][ny]: # то эти значения и оставляются x, y = nx, ny else: # а если индекс выскочил за границу матрицы # или наткнулся на уже занятую ячейку # то разворачиваемся на 90 градусов # путем замены приращения по x и y друг на друга # а минус нужен, чтобы он не ходил только вправо или вниз, # а чередовал с движениями вверх или влево. # Так и получается спираль dx, dy = -dy, dx # и используем уже это изменённое движение для новых значений x и y x, y = x+dx, y+dy # После того, как перебрали все элементы, # печатаем то, что получилось for x in list(zip(*arr)): print(*x) # А здесь вся вышеописанная функция # вызывается с аргументом, который вводит пользователь с клавиатуры zm(int(input()))

Комментариев нет:

Отправить комментарий