思考问题的方式
其实汉诺塔问题和我上次的青蛙跳台阶问题思考问题的方式一样。
都是先找规律,然后再将问题进行分解,然后化为小问题,进而写代码,接下来我们来解决这个问题。
我们废话不多说,开始正题!
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。
希望各位指正,我们共同进步!