递归求解汉诺塔问题(C++)
【问题描述】
Hanoi(汉诺)塔问题。这是一个经典的数学问题:古代有一个梵塔,塔内有3个座A,B,C,开始时A座上有64 个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到C座,但每次只允许移动个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在E移动过程中可以利用B座,要求编写程序打印出若只有n个盘子时移动的步骤。
【问题分析】
1.假设最开始A座上有n个盘子,如果我们能够将最下面的盘子通过B座移到C座上,则我们只需要再把A座上的n-1个盘子全部挪到C座即可。
2.要将最下面的盘子移到C座上,则必须先将上边的n-1个盘子通过C座挪到B座上,再把最大的盘子直接挪到C座即可。
3.然后再将B座上的n-1个盘子通过A座挪到C座上即可,这样就实现了一个递归。
【代码实现】
#include <iostream>
using namespace std;
int main()
{
void hnt(int n,char a,char b,char c);
int num;
char a,b,c;
a='A';
b='B';
c='C';
cin>>num;
hnt(num,a,b,c);
return 0;
}
void hnt(int n,char a,char b,char c)
{
if(n==1) cout<<a<<"--->"<<c<<endl;
else
{hnt(n-1,a,c,b);
hnt(1,a,b,c);
hnt(n-1,b,a,c);
}
}
若要求再对盘子进行编号,实现代码如下:
#include <iostream>
using namespace std;
void Move(int n,char x,char y)
{
cout<<x<<"->"<<n<<"->"<<y<<endl;
}
void Hannoi(int n,char a,char c,char b)
{
if(n==1) Move(1,a,b);
else
{Hannoi(n-1,a,b,c);
Move(n,a,b);
Hannoi(n-1,c,a,b);
}
}
int main()
{
int n;
char a,b,c;
cin>>n>>a>>b>>c;
Hannoi(n,a,c,b);
return 0;
}