如果不知道汉诺塔建议看一下b站的比特大博哥的汉诺塔递归实现视频:
什么是汉诺塔?汉诺塔就是由三根柱子组成的,第一个柱子上有n个盘子,就叫汉诺塔。
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
规则:a柱上有n个圆盘,将这n个圆盘全部移动到c柱上,每次只能移动一个圆盘,并且移动的过程中,小盘必须在大盘上面。
当a柱上有n个圆盘时,就需要移动2^n-1次才可以全部移动到c柱上,所以64个圆盘需要移动2^64-1次也就是18446744073709551616次,这个数非常庞大,就算一秒移动一次光盘也需要移动5000亿年。
假设a柱上有2个圆盘:
第一步:第一个圆盘要先从a柱移到b柱
第二步:再将a柱的下一个圆盘移到c柱
第三步:最后再将b柱的圆盘移到c柱,然后完成了移到。
但是如果a柱上有三个圆盘就需要先将第一个圆盘移到c柱,将第二个圆盘移到b柱,将第一个圆盘从c柱移到b柱,然后再将第三个圆盘移到c柱,将第一个圆盘从b柱移到a柱,将第二个圆盘从b柱移到c柱,最后再将第一个圆盘移到c柱。总共用了7次(2^3-1)移动。
从中我们可以得知一个规律知道,当a柱上的圆盘数是奇数个时,第一次移动必定先移动到c柱。当a柱的圆盘数是偶数个时,第一次移动必定先移动到b柱。
知道了汉诺塔的规律,那我们就可以写一个代码来计算汉诺塔的移动过程:
#include <stdio.h>
void mode(char a, char b)
{
printf("%c -> %c\n", a, b);//打印移动过程,从?柱移动到?柱
}
void hano(char a, char b, char c, int n)
{
if (n == 1)
mode(a, c);//递归来到n==1时打印变量a移到变量c的过程
else
{
hano(a, c, b, n - 1);//每次函数递推时将b和c的位置调换
mode(a, c);//递推结束第一次返回打印当前变量a移到变量c的过程
hano(b, a, c, n - 1);//再次递推调换变量a和变量b的位置
}
}
int main()
{
int n = 0;
scanf("%d", &n);
hano('a', 'b', 'c', n);
return 0;
}
以上就是汉诺塔的移动过程代码,可以自己边画图边对照上面的代码,慢慢理解。
如果还是不会建议看一下b站的比特大博哥的汉诺塔递归实现视频:
本篇文章到这里也就结束了,再见