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