Имеется три стержня a, b и c на а нанизаны пирамидкой несколько колец разного диаметра. Задача состоит в том, чтобы перенести пирамиду за наименьшее число ходов на стержень b, используя стержень c, как вспомогательный.
За один раз разрешается переносить только одно кольцо, причём нельзя класть большее кольцо на меньшее.
Рис. 1. Головоломка "Ханойские башни" с пятью кольцами.
Рекурсивный метод:
#include <iostream>
void play(int n, char a, char b, char c){
if(n<=0) return;
play(n-1, a, c, b);
printf("диск %d %c -> %c \n", n, a, b);
play(n-1, c, b, a);
}
int main(int argc, char *argv[]){
if(argc!=2){
printf("Запускайте программу с числовым аргументом (количество дисков)\n");
exit(1);
}
play(atoi(argv[1]), 'a', 'b', 'c');
return 0;
}
./main 5
диск 1 a -> b
диск 2 a -> c
диск 1 b -> c
диск 3 a -> b
диск 1 c -> a
диск 2 c -> b
диск 1 a -> b
диск 4 a -> c
диск 1 b -> c
диск 2 b -> a
диск 1 c -> a
диск 3 b -> c
диск 1 a -> b
диск 2 a -> c
диск 1 b -> c
диск 5 a -> b
диск 1 c -> a
диск 2 c -> b
диск 1 a -> b
диск 3 c -> a
диск 1 b -> c
диск 2 b -> a
диск 1 c -> a
диск 4 c -> b
диск 1 a -> b
диск 2 a -> c
диск 1 b -> c
диск 3 a -> b
диск 1 c -> a
диск 2 c -> b
диск 1 a -> b