什么是汉诺塔?
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
汉诺塔问题分析:
1. 若只有1个圆盘,就只需要移动 1 次,即 A → C;
2. 若有2个圆盘,则需要移动 3 次,即 A→B,A→C,B→C;
3. 若有三个圆盘,则需要移动 7 次,即 A→ C,A→ B,C→ B,A→ C,B→ A,B→ C,A→ C;
代码实现:
这里的 A,B,C分别代表 起始位置,中转位置,目标位置
#include<bits/stdc++.h>
using namespace std;
void move(char pos1,char pos2){
printf(" s%c-->%c ",pos1,pos2);
}
void Hanio(int n, char pos1,char pos2,char pos3){
if(n==1){
move(pos1,pos3);
}
else{
Hanio(n-1,pos1,pos3,pos2);
move(pos1,pos3);
Hanio(n-1,pos2,pos1,pos3);
}
}
int main(){
Hanio(1,'A','B','C');
cout<<"\n";
Hanio(2,'A','B','C');
cout<<"\n";
Hanio(3,'A','B','C');
cout<<"\n";
return 0;
}
结果: 只取了 1个盘子,2个盘子,3个盘子。
总结一下:
汉诺塔问题,是一个非常经典的递归问题。其规则为将所有圆盘从第一个柱子移动至第三个柱子,且每次只能移动一个圆盘,并且大圆盘不能放在小圆盘上面。虽然规则简单,但随着圆盘数量的增加,移动次数呈指数级增长。具体来说,移动次数可以按照2^n - 1来计算,其中n为圆盘数量。因此,汉诺塔问题在圆盘数量较大时,移动次数是指数级增长的,可以说是指数爆炸。