1 汉诺塔描述:
汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
2汉诺伪算法:
当只有一个盘子的时候,只需要从将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塔上。
综上所述,除了只有一个盘子时不需要借助其他塔外,其余情况均一样(只是事件的复杂程度不一样)
3 假设盘子为3个时候,图描述
4 c语言完整代码
#include<stdio.h>
int num = 0; //计数器,计算用了多少步
char A = 'A',B = 'B',C = 'C'; // 模拟A,B,C三个塔
/*
getOther函数为得到另外一个塔名称,
假设 from = A ,to = B,那么返回为 C
*/
char getOther(char from,char to){
if(A != from && A != to){
return A;
}else if(B != from && B != to){
return B;
}else{
return C;
}
}
//用来输出从哪个塔移动到哪个塔
void move(char from ,char to){
num++;
printf("第%d步 : %c --> %c\n",num,from,to);
};
//实现函数
void Hanoi(int n ,char from,char to){
if(n==1){
move(from,to);
}else{
char other = getOther(from,to);
Hanoi(n-1,from,other);
move(from,to);
Hanoi(n-1,other,to);
}
}
int main(){
int n = 2;
printf("有 %d 个盘子时候 : \n",n);
Hanoi(n,'A','C');
return 1;
};
5 输出结果图
5.1 假设有2个盘子
5.2 假设有3个盘子
5.3 假设有64个盘子,电脑跑了半个小时,还没有计算完。。。汗。。。垃圾配置,就不贴图了.