汉诺塔问题

汉诺塔问题是一个古典的数学模型,是一个用递归问题解决的典型例子,问题如下:古代有个梵塔,塔内有3个座A,B,C,开始时A座上有64个盘子,盘子大小不定,大的在下,小的在上。有一个老和尚想把这64个盘子从A移到C,但规定一次只能移动一个盘子,且在移动过程中在3个座上始终保持大盘在下,小盘在上,在移动过程中可利用B座。

 

 

解题思路:如果用人为移动的话需要移动2^64次,移一辈子都移不完,但用递归的话很快就可以完成。

假如有两个盘子,将A最上面的小盘移到B上,再将A的大盘移动到C上,最后将B上移动到C。

假如有三个盘子,将A最上面的小盘移到c上,将A的中盘移动到B上,再将C上移动到B。最后将A上移动到C,最后将B按照移动两个盘子的方法移动到C上。

假如有四个盘子……

以此类推,总之一直保持将A上除了最大盘之外的所有盘移动到B上,将A移动到C,最后再将B全部移到C上。

 

代码如下所示:

#include <stdio.h>

 

void Move(char x,char y)

{

         printf("%c->%c\n",x,y);

}

 

void Hanoi(int n,char a,char b,char c)

{

         if(n==1)

         {

                  Move(a,c);//交换a,c

         }

         else

         {

                  Hanoi(n-1,a,c,b);//给N-1,开始递归 交换C,B

                  Move(a,c);

                  Hanoi(n-1,b,a,c);//交换B,A,相当于将A上的放到了B上

         }

}

 

int main()

{

         Hanoi(2,'A','B','C');

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值