«Ханойская башня» является одной из популярных головоломок XIX века. Даны три стержня, пронумерованные числами 1, 2, 3. На стержень 1 надета пирамидка из n дисков различного диаметра в порядке возрастания диаметра дисков, если рассматривать их сверху вниз. Диски можно перекладывать с одного стержня на другой по одному, при этом диск нельзя класть на диск меньшего диаметра. Необходимо переложить всю пирамидку со стержня 1 на стержень 3, используя стержень 2 как вспомогательный, за минимальное число перекладываний.
Требуется написать функцию, которая решает головоломку: для данного числа дисков n печатает последовательность перекладываний в формате a b c, где a — номер перекладываемого диска, b — номер стержня, с которого снимается данный диск, c — номер стержня, на который надевается данный диск.

Для решения этой задачи напишем рекурсивную функцию, которая будет получать размер пирамидки, номер стержня, на который она надета, и номер стержня, на который она должна переместиться. Тогда, чтобы переместить пирамидку размером n со стержня f на стержень t, сначала рекурсивно переместим пирамидку размером n−1 со стержня f на промежуточный стержень v=6−f−t. Затем диск размером n переместим со стержня f на стержень t. После этого рекурсивно переместим пирамидку размером n−1 с промежуточного стержня v на стержень t. Код такой рекурсивной функции может иметь следующий вид:
void hanoi(int n, int f, int t) {
if (n == 0) {
return;
}
int v = 6 - f - t;
hanoi(n - 1, f, v);
cout << n << " " << f << " " << t << endl;
hanoi(n - 1, v, t);
}
|