汉诺塔是一个经典的递归问题,也是栈的应用。它涉及到将一堆大小不同的盘子从一个柱子移动到另一个柱子,同时满足以下规则:一次只能移动一个盘子。大盘子不能放在小盘子上面。可以使用第三个柱子作为辅助。
解题步骤:
1.如果只有一个盘子,直接将它从源柱子移动到目标柱子。
2.对于n个盘子,首先,将n-1个盘子从源柱子移动到辅助柱子(使用目标柱子作为另一个辅助)然后,将剩下的最大盘子从源柱子移动到目标柱子。最后,将n-1个盘子从辅助柱子移动到目标柱子
时间复杂度:汉诺塔的时间复杂度是O(2^n)
空间复杂度:汉诺塔的空间复杂度是O(n)
#include<iostream>
using namespace std;
//递归
void hanoi(int paraN, char paraSource, char paraDestination, char paraTransit) {
if (paraN <= 0) {
return;
}
else {
hanoi(paraN - 1, paraSource, paraTransit, paraDestination);
printf("%c -> %c \r\n", paraSource, paraDestination);
hanoi(paraN - 1, paraTransit, paraDestination, paraSource);
}
}
void hanoiTest() {
printf("---- hanoiTest begins. ----\r\n");
printf("2 plates\r\n");
hanoi(2, 'A', 'B', 'C');
printf("3 plates\r\n");
hanoi(3, 'A', 'B', 'C');
printf("---- hanoiTest ends. ----\r\n");
}
void main() {
hanoiTest();
}
end