1_6_0用栈来求解汉诺塔问题_传统汉诺塔问题求解

来源:互联网 发布:linux 搭建lamp 编辑:程序博客网 时间:2024/05/16 09:20

1. 传统的汉诺塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求打印移动的步骤。如果只有一个盘子,则不需要利用B座,直接将盘子从A移动到C。


解决思路:利用递归。目标:想办法依次把最大的圆盘移动到C盘。

如图所示:设有n个圆盘,把上面的n-1个圆盘看成一个整体,然后进行移动,

想办法将最大的圆盘移动到C盘 <-----需要 搬掉柱子A上面n-1个盘子到temp B柱子上后,将A柱最底下的盘子移动到C盘上

step1和step3是可以迭代的过程,则总结起来如下:

第一步:将n-1个盘子从A柱移动至B柱(借助C柱为过渡柱)
第二步:将A柱底下最大的盘子移动至C柱
第三步:将B柱的n-1个盘子移至C柱(借助A柱为过渡柱)


时间复杂度:2^n -1


具体代码如下:

#include <iostream>using namespace std;static int step=0;void move(int n,char source, char dest){printf("step %d, 将第%d号盘子从 %c 移动到 %c\n",step,n, source, dest);}void hannuota(int n, char sour, char temp, char dest){if (n==1){move(n, sour, dest);++step;}else{hannuota(n - 1, sour, dest, temp);move(n, sour, dest);++step;hannuota(n - 1, temp, sour, dest);}}int main(){int n;//盘子数量cin >> n;hannuota(n, 'A', 'B', 'C');printf("Total step is %d\n", step);system("pause");return 1;}



0 0
原创粉丝点击