Определите последовательность перемещений в «Ханойской башне» -Python(Питон)

Ограничение по времени работы программы: 1 секунда
Оригинал Ханойской башни был подвергнут реставрации. В связи с этим во время пользования головоломкой нельзя было перекладывать диски с первого стержня сразу на третий и наоборот (но можно переложить диск с первого стержня на второй, а с него — на третий). При каждом перемещении должно сохраняться правило о том, что нельзя класть диск большего размера на меньший.
Определите последовательность перемещений, необходимых для переноса башни из n дисков со стержня номер 1 на стержень номер 3.
ВХОДНЫЕ ДАННЫЕ

Программа получает на вход количество дисков в пирамидке n (1≤n≤10).

ВЫХОДНЫЕ ДАННЫЕ

Программа должна вывести последовательность перемещений пирамидки из n дисков со стержня номер 1 на стержень номер 3 в соответствии с правилами этой игры. Каждое перемещение состоит из трех чисел, записанных в одной строке через пробел: номер диска (число от 1 до n, самый маленький диск имеет номер 1, самый большой — номер n), номер стержня, с которого снимается диск (1, 2 или 3), номер стержня, на который кладется диск (1, 2 или 3).
Вам не нужно находить минимальное решение, но количество совершенных перемещений не должно быть больше 200000, при условии, что количество дисков не превосходит 10.ПРИМЕР:

ввод

1

вывод

1 1 2
1 2 3

ввод

2

вывод

1 1 2
1 2 3
2 1 2
1 3 2
1 2 1
2 2 3
1 1 2
1 2 3

Для решения данной задачи можно использовать рекурсивный алгоритм, известный как «Ханойская башня». Мы можем разбить задачу на подзадачи меньшего размера и решать их рекурсивно. Вот как это можно сделать на языке Python:

def hanoi(n, source, target, auxiliary):
    if n > 0:
        # Перемещаем n-1 диск с исходного стержня на вспомогательный
        hanoi(n-1, source, auxiliary, target)
        
        # Перемещаем самый большой диск с исходного стержня на целевой
        print(n, source, target)
        
        # Перемещаем n-1 дисков с вспомогательного стержня на целевой
        hanoi(n-1, auxiliary, target, source)

# Получаем входные данные
n = int(input())

# Вызываем функцию hanoi с исходными параметрами
hanoi(n, 1, 3, 2)

В данном коде функция hanoi принимает следующие аргументы:

  • n: количество дисков
  • source: номер исходного стержня
  • target: номер целевого стержня
  • auxiliary: номер вспомогательного стержня

Функция рекурсивно вызывает себя, перемещая n-1 дисков с исходного стержня на вспомогательный, затем перемещает самый большой диск с исходного стержня на целевой, и, наконец, перемещает n-1 дисков с вспомогательного стержня на целевой.

Мы вызываем функцию hanoi с исходными параметрами (n, 1, 3, 2), где n — это количество дисков, 1 — номер исходного стержня, 3 — номер целевого стержня, 2 — номер вспомогательного стержня.

Функция print используется для вывода последовательности перемещений в требуемом формате.

Leave a Comment