例 有三根针A,B,C. A针上有n个盘子,盘子大小不等,大的在下,小的在上。如图所示:
要求把这n个盘子从A针移到C针,在移动的过程中可借助B针,每次只能移动一个盘子,切在移动过程中都保持大盘在下,小盘在上。
分析:将n个盘子从A针移到C针,可以分解为下面几个步骤,
(1)将A针上n-1个盘子移到B针上,可借助C针;
(2)将A针上剩下的一个盘子移到C针上;
(3)将n-1个盘子从B针移到C针,可借助A针;
其实,上面的三个步骤包含了两种操作:
1.将多个盘子从一个针移到另一个针上,这是一个递归过程;
2.将一个盘子从一个针移到另一个针上;
用两个函数可以分别实现上面的两种操作,用hanoi函数实现第一种操作,move函数实现第二中操作。
源程序:
#include<iostream>
using namespace std;
void move(char src,char dest) //把src针最上面的一个盘子直接移到dest针上
{
cout<<src<<"--"<<dest<<endl;
}
void hanoi(int n,char src,char medium,char dest) //把n个盘子从src针上移到dest针上,借助medium针
{
if(n==1)
move(src,dest);
else
{
hanoi(n-1,src,dest,medium); //第一步需要把n-1个盘子从src针上移到medium针上,借助dest针
move(src,dest); //第二步把src针上剩下的一个盘子直接移到dest针上
hanoi(n-1,medium,src,dest); //第三步把medium针上的n-1个盘子移到dest针上,借助src针
}
}
int main()
{
int m;
cout<<"Enter the number of diskes: ";
cin>>m;
cout<<"the step to moving"<<m<<"diskes: "<<endl;
hanoi(m,'A','B','C');
return 0;
}
结果输出: