汉诺塔问题

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
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)

你可能感兴趣的:(算法,#,递归与分治策略,算法)