汉诺塔(梵塔)问题几乎是所有的初学编程的人遇到的问题,这个问题很好的运用了递归的特性,将原来看起来不好解决的问题变得异常简单,而且很容易理解。问题所有的人都知道就不描述了,代码很简单且有注释就不解释了
#include<iostream>
using namespace std;
int cnt=1; //step计数
void hanoi(int n,char A,char B,char C);
int main()
{
int n;
char A,B,C;
cout<<"3个柱子编号A B C,将圆盘从A借助C移到B,输入圆盘个数"<<endl;
cin>>n;
A='A'; B='B'; C='C';
hanoi(n,A,B,C); //将n个圆盘从A借助C移动到B
return 0;
}
void hanoi(int n,char A,char B,char C)
{
if(n==1) //如果只有一个圆盘,直接移动就可以了
cout<<cnt++<<" "<<A<<"-->"<<B<<endl;
else{//大于一个圆盘时,先将前n-1个移到C上,然后将最后一个移到B上,最后再把C上的n-1个圆盘移到B上
hanoi(n-1,A,C,B);
cout<<cnt++<<" "<<A<<"-->"<<B<<endl;
hanoi(n-1,C,B,A);
}
}
PS:这个问题很简单,但是突然想到如果这个问题不是只有3个柱子,而是要求输入有n个圆盘,有m个柱子可以用,应该怎么做。通过大于3个的柱子容易证明必然会得到更好的解,也就是解随柱子的个数是单调不升的。
最开始以为会和原问题差不多的简单,但是后来写了几个递推式看了一下都不对,太晚了,有空再想想吧