- 魔王的介绍:️一名双非本科大一小白。
- 魔王的目标:努力赶上周围卷王的脚步。
- 魔王的主页:大魔王.
❤️大魔王与你分享:对我说过“别走好吗”只有体育老师而已。
汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?
这是一个经典的递归问题,学递归的时候一般都会引入这个问题。
我们先自己想出圆盘数为1、2、3时的情况:
1个的话:直接从a移动到c
2个的话,我们需要需要借助b柱,第一步:将上面的移动到b柱,第二部:将下面的移动到c柱,第三步:再让b柱上那个借助a柱移动到c柱,也就是需要三步。
3个的话,这个的递归思想就比较容易发现了,首先将上面的两个(也就是n-1个)看作一个整体,就相当于上面的2个圆盘的情况了,(对应着上面的理解)不过这个的第一步和第三步都是移动的两个圆盘,所以不能直接移动,又把两个的分为一个加一个,如下图
更多的话类比就ok,都是一样的。
//汉诺塔
#include
void move(char a, char c)
{
printf("%c->%c\n", a, c);
}
void Hanoi(int n,char a,char b,char c)
{
if (n == 1) //如果递归拆解到n=1,那么就直接从原位置移动到目标位置。
move(a, c);
else //如果n>1,还是要继续递归,因为一次只能移动一个圆盘,而且也要符合要求(小的在大的上面)
{
Hanoi(n - 1,a,c,b); //将n-1个移动到辅助位置
move(a, c); //将最后一个移动到目标位置
Hanoi(n - 1, b, a, c); //将移动到辅助位置的这些再移动到目标位置
}
}
int main()
{
int n = 0;
scanf("%d", &n);
Hanoi(n,'A','B','C');
return 0;
}
✨请点击下面进入主页关注大魔王
如果感觉对你有用的话,就点我进入主页关注我吧!