经典递归解决汉诺塔!

算法:当只有一个盘子的时候,只需要从将A塔上的一个盘子移到C塔上。

            当A塔上有两个盘子是,先将A塔上的1号盘子(编号从上到下)移动到B塔上,再将A塔上的2号盘子移动的C塔上,最后将B塔上的小盘子移动到C塔上。

            当A塔上有3个盘子时,先将A塔上编号1至2的盘子(共2个)移动到B塔上(需借助C塔),然后将A塔上的3号最大的盘子移动到C塔,最后将B塔上的两个盘子借助A塔移动到C塔上。

           当A塔上有n个盘子是,先将A塔上编号1至n-1的盘子(共n-1个)移动到B塔上(借助C塔),然后将A塔上最大的n号盘子移动到C塔上,最后将B塔上的n-1个盘子借助A塔移动到C塔上。

          综上所述,除了只有一个盘子时不需要借助其他塔外,其余情况均一样(只是事件的复杂程度不一样)。

         

#include <stdio.h>
//第一个塔为初始塔,中间的塔为借用塔,最后一个塔为目标塔
int i=1;//记录步数
void move(int n,char from,char to) //将编号为n的盘子由from移动到to
{
    printf("第%d步:将%d号盘子%c---->%c\n",i++,n,from,to);
}
void hanoi(int n,char from,char depend_on,char to)//将n个盘子由初始塔移动到目标塔(利用借用塔)
{
    if (n==1)
    move(1,from,to);//只有一个盘子是直接将初塔上的盘子移动到目的地
	else
	{
      hanoi(n-1,from,to,depend_on);//先将初始塔的前n-1个盘子借助目的塔移动到借用塔上
	  move(n,from,to);              //将剩下的一个盘子移动到目的塔上
	  hanoi(n-1,depend_on,from,to);//最后将借用塔上的n-1个盘子移动到目的塔上
	}
}
void main()
{
	 printf("请输入盘子的个数:\n");
	 int n;
	 scanf("%d",&n);
	 char x='A',y='B',z='C';
	 printf("盘子移动情况如下:\n");
	 hanoi(n,x,y,z);
}


  • 113
    点赞
  • 256
    收藏
    觉得还不错? 一键收藏
  • 60
    评论
guide: 1、此程序为汉诺塔程序(此代码用到递归,包括直接递归和间接递归(间接递归是用在了重复使用本程序那块)); 2、此程序的代码流程是,由main函数进入之后,先后调用的函数是由上至下定义的; 3、亲爱的朋友,请尊重偶的版权,你也会得到相应的尊重哦! 4、若此程序或代码有不足或不对的地方,还望得到指正! 5、循环虽然比递归算法快,但比较而言,递归更容易让人理解! purpose: 1、培养独立思考算法的能力,特别是递归时,用到的是数学中的数列,找到整个递归的最先出栈的函数,以及数列的第n项与第n-1项的关系就能用递归解决问题; 2、通过试数来推算自己的程序逻辑是否有beg,并找出修复之; 3、熟练一下结构体和链表的基本推理,尤其是插入和删除元素时指针的走向! function: 1、简易输出汉诺塔步骤(由哪根柱子移到哪根柱子); 2、详细输出汉诺塔步骤(在功能1基础上逐步输出每次移动之后的盘子分布); 3、二维详细输出汉诺塔步骤(在前2功能基础上逐步输出二维盘子分布图); 4、动态二维输出汉诺塔步骤(在前3功能基础上演示动态输出并提示下一步); 5、可重复使用本程序! 在VC++6.0中的输出结果是: --------------------------- ………… 开始移动: 第1次移动过程: A(1号盘)→B 此时灰原の盘子分布图: A柱子 B柱子 C柱子 ↓ ↓ ↓ 1层为空层 第2层: 2* 1* 请按任意键继续. . . 第2次移动过程: A(2号盘)→C 此时灰原の盘子分布图: A柱子 B柱子 C柱子 ↓ ↓ ↓ 1层为空层 第2层: 1* 2* 请按任意键继续. . . 第3次移动过程: B(1号盘)→C 此时灰原の盘子分布图: A柱子 B柱子 C柱子 ↓ ↓ ↓ 第1层: 1* 第2层: 2* 请按任意键继续. . . 请问您是否要继续重玩游戏,需要重玩请按“Y”,否则按“N”结束程序! ………… ---------------------------

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 60
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值