hanoi塔问题设a、b、c是3个塔座。开始时,在塔座a上有一叠共n个圆盘,这些圆盘自下而上,由大到小地叠放在一起,各圆盘从小到大编号为1,2,……,n如图所示。先要将塔座a上的这一叠圆盘移到塔座b上,并仍按同样顺序叠置。在移动圆盘时应该遵守以下,移动规则 规则1:每次只能移动一个圆盘 规则2:任何时刻都不允许将较大的圆盘压在较小的圆盘之上。规则3:在满足移动规则1和2的前提下,可将圆盘移动到a、b、c中任意一塔座上。这个问题有一个简单的解法。假设塔座a、b、c排成一个三角形,a->b->c->a构成一个顺时针循环。在移动圆盘的过程中,若是奇数次移动,则将最小的圆盘移到顺时针方向的下一塔座上,若是偶数次移动,则保持最小的圆盘不动,而在其他两个塔座之间,将较小的圆盘移到另一塔座上去用递归技术解决这个问题。当n=1时,问题比较简单。此时只要将编号为1的圆盘直接移至塔座b上即可。当n>1时,需要利用塔座C作为辅助塔座。此时要设法将n-1个较小的圆盘依照移动规则从塔座c移到塔座b上。由此可见,n个圆盘的移动问题,就可分解为两次n-1个圆盘的移动问题,这又可以用递归地用上述方法来做,由此可以设计出解Hani塔问题的递归算法如下
C++实现
#include<iostream>
using namespace std;
/*hanoi塔问题
*设a、b、c是3个塔座。开始时,在塔座a上有一叠共n个圆盘,这些圆盘自下而上,
* 由大到小地叠放在一起,各圆盘从小到大编号为1,2,……,n
* 如图所示。先要将塔座a上的这一叠圆盘移到塔座b上,并仍按同样顺序叠置。
* 在移动圆盘时应该遵守以下,移动规则
* 规则1:每次只能移动一个圆盘
* 规则2:任何时刻都不允许将较大的圆盘压在较小的圆盘之上。
* 规则3:在满足移动规则1和2的前提下,可将圆盘移动到a、b、c中任意一塔座上。
* 这个问题有一个简单的解法。假设塔座a、b、c排成一个三角形,a->b->c->a构成一个顺时针循环。
* 在移动圆盘的过程中,若是奇数次移动,则将最小的圆盘移到顺时针方向的下一塔座上,
* 若是偶数次移动,则保持最小的圆盘不动,而在其他两个塔座之间,将较小的圆盘移到另一塔座上去
*用递归技术解决这个问题。当n=1时,问题比较简单。此时只要将编号为1的圆盘直接移至塔座b上即可。
* 当n>1时,需要利用塔座C作为辅助塔座。
* 此时要设法将n-1个较小的圆盘依照移动规则从塔座c移到塔座b上。
* 由此可见,n个圆盘的移动问题,就可分解为两次n-1个圆盘的移动问题,
* 这又可以用递归地用上述方法来做,由此可以设计出解Hani塔问题的递归算法如下
*/
//b作为目标柱,c作为中间柱子
void hanoi(int n,int a,int b,int c)
{
if(n>0)
{
hanoi(n-1,a,c,b);
cout<<a<<"->"<<b<<endl;
hanoi(n-1,c,b,a);
}
}
int main()
{
hanoi(2,1,2,3);
}
python实现
def hanoi(n,a,b,c):
if(n>0):
hanoi(n-1,a,c,b);
print(a,"->",b)
hanoi(n-1,c,b,a)
hanoi(2,1,2,3)