汉诺塔问题(详解)

思考问题的方式

       其实汉诺塔问题和我上次的青蛙跳台阶问题思考问题的方式一样。

        都是先找规律,然后再将问题进行分解,然后化为小问题,进而写代码,接下来我们来解决这个问题。

       我们废话不多说,开始正题!

1.汉诺塔问题的描述

        相传在古印度圣庙中,有一种被称为汉诺塔的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘。                ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​  游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

 2.找规律

        这个问题显然不可能让我们一个一个找出这个有多少个步骤,这样太麻烦了,我也懒得弄,我们学习算法,本质上就是为我们解决一些复杂的问题,进而做出一个便利的产品。

 我们假设有n个盘子

当n=1时,

 当n=2时:

当n=3时,这是的难度就上来了

 

 我知道这样很难理解,接下来,我通过图形来理解过程

然后

 

这样,N=3时就完成了

我们可以总结了:

当盘子的个数是N是,我们可以先不看最下面的一个,把上面的N-1个看成一个整体。

这是第一步:那么就需要我们把N-1个盘子想办法从A通过C这个中转站放到B上。

第二步:将最后的一个最大的盘子放到C上   也就是A-->C。

第三步:将这个N-1个盘子想办法从B通过A这个中转站放到C上,

结束!

我觉得同志们还是有一点懵:没关系,看图

 

 第一步:就是我上面说的(我们把N-1个盘子想办法从A通过C这个中转站放到B上。),将它变成这个样子

第二步:

将最后的一个最大的盘子放到C上   也就是A-->C。

第三步:

 

 我们发现,每次减去一个盘子将剩下的盘子看成一个整体,这不就是大问题化为小问题的思想吗?

so ,我们可以利用递归思想。

那么上代码吧

define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void move(char pos1,char pos2)
{
	printf("%c-->%c", pos1, pos2);
}

 void hannuo(int n, char pose1, char pose2, char pose3)//pose1是起始位置,pose2是中间位置,pose3是最后位置
{
	 if (n == 1)
	 {
		 move(pose1, pose3);
	 }
	 else
	 {
		 hannuo(n - 1, pose1, pose3, pose2);//第一步
		 move(pose1, pose3);//第二步
		 hannuo(n - 1, pose2, pose1, pose3);//第三步
	 }
}


int main()
{
	int n = 0;
	scanf("%d", &n);
	hannuo(n,'A','B','C');


	return 0;
}

 代码的结果例子就是:

当n=4是这样的

 

顺便说一下,这个规律就是所需要的步骤数就是2的n次方-1。 

希望各位指正,我们共同进步!

 

 

 

 

  • 15
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值