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

时间:2021-07-07 11:08:34

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

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

具体代码如下:

#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;

}