Tips:因为要大盘子不能在小盘子上面,所以,init杆上最大的盘子肯定是首先要移动到des杆上的。
于是问题就转化为:
*先把init杆的n-1个盘子全部移动到tem杆,以des杆为临时辅助
*然后把init的最大盘子移动到des杆,
*接着把tem杆上的所有盘子移动到des杆,以init杆为临时辅助
当盘子的个数大于1时,就不停的重复以上三个步骤。
下图给出3个盘子时的递归过程:
实现代码:
//n代表盘子的数目,init代表盘子所在的初始化杆,
//des代表盘子移向的目的杆,tem代表交换时的临时辅助杆void hanoi(int n,string init,string tem,string des)
{
if(n==1)//停止条件:移动一个盘子
{
cout<<init<<"==>"<<des<<endl;
return;
}
hanoi(n-1,init,des,tem);// 把n-1个盘子从init移动tem,以des为临时辅助
cout<<init<<"==>"<<des<<endl;//移动最大的盘子
hanoi(n-1,tem,init,des);//把n-1个盘子从tem移动到des,以init为辅助
}
int main()
{
hanoi(3,"A","B","C");
return 0;
}
运行结果