Ханойские башни рекурсия

Задача №3050. Ханойские башни

Головоломка “Ханойские башни” состоит из трех стержней, пронумерованных числами 1, 2, 3. На стержень 1 надета пирамидка из n дисков различного диаметра в порядке возрастания диаметра. Диски можно перекладывать с одного стержня на другой по одному, при этом диск нельзя класть на диск меньшего диаметра. Необходимо переложить всю пирамидку со стержня 1 на стержень 3 за минимальное число перекладываний.

Напишите программу, которая решает головоломку; для данного числа дисков n печатает последовательность перекладываний в формате a b c, где a — номер перекладываемого диска, b — номер стержня с которого снимается данный диск, c — номер стержня на который надевается данный диск.

Например, строка 1 2 3 означает перемещение диска номер 1 со стержня 2 на стержень 3. В одной строке печатается одна команда. Диски пронумерованы числами от 1 до n в порядке возрастания диаметров.

Входные данные

Вводится натуральное число n.

Выходные данные

Программа должна вывести минимальный (по количеству произведенных операций) способ перекладывания пирамидки из данного числа дисков.

Примеры

входные данные

2

выходные данные

1 1 2 2 1 3 1 2 3

Можете дать подсказки по решению задачи или идею

Решал ли ты до этого задачи на рекурсию?

Подсказка :
Допустим ты можешь переместить пирамидку размера n - 1 из стержня x на стержень y. Как бы ты тогда решал задачу?

1 лайк

.
Да .
.

1 лайк

переместил бы все пирамидки до n на стержень у, а потом n пирамидку на третий стержень и дальше попробовал бы переместить n-1 пирамидок на третий.

Этого достаточно, теперь подумай как это решать рекурсией.

Подсказка (Открой если вообще идей не приходит в течении 10 минут):

rec(razmer, sterzhen1, sterzhen2)

2 лайка

Например есть 3 диска, могу ли я переместить 2 диск когда на нем 1диск на другой стержень?

1 лайк

Можешь дать еще одну подсказку

смотри ты уже знаешь решение фактически, если ты знаешь что верхние n - 1 переносишь на 2ой стержень, а затем n на третий. Давай рассмотрим этот процесс подробнее, для того чтобы перенести n - 1 с первой на второй стержень, тебе нужно перенести сначала n - 2 диска на 3ий, положить n - 1-ый на второй стержень, и затем перенести n - 2 диска с 3го на 2ой. Это собственно и все решение, просто теперь попробуй симулировать ручкой в тетради такой процесс и поймешь мб как рекурсией делать
если нет:

Т.е в том что я делал у нас была изначальная функция rec(n,start,end), я делаю rec(n - 1,start, которая не start и не end), ложу n на end, делаю rec(n - 1,которая не start и не end, end)

5 лайков