1.介绍
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。这个传说讲述了大梵天创造世界时,在三根金刚石柱子上摞着64片黄金圆盘,并要求将其按大小顺序重新摆放在另一根柱子上,规则是小圆盘不能放在大圆盘上面,且一次只能移动一个圆盘。汉诺塔不仅是一个玩具,更是一个经典的递归问题,其解决方案展示了递归思想的魅力。12
汉诺塔的玩法非常简单:有三根杆子A、B、C,A杆上有若干碟子,每次只能移动一个碟子,且小的碟子只能叠在大的碟子上面。目标是把所有碟子从A杆全部移到C杆上。这个过程中,B杆可以作为辅助,但需要遵循特定的规则和步骤。
汉诺塔问题的解决算法展示了递归思想的巧妙应用。解决汉诺塔问题的步骤数是2的n次方减1(n为盘子数量),对于64个盘子的汉诺塔,需要的移动次数是一个惊人的数字:18446744073709551615。这个数字展示了递归算法在处理这类问题时的效率和优雅。
此外,汉诺塔的玩法和规则也体现了逻辑思考和问题解决的能力。通过理解和应用汉诺塔的规则,人们可以在游戏中锻炼自己的逻辑思维和问题解决技巧。
总之,汉诺塔不仅是一个富有挑战性的益智游戏,更是一个展示递归思想和逻辑思考的经典案例。无论是作为玩具还是作为教学工具,汉诺塔都深受人们的喜爱和推崇。
2.分步代码演示
2.1.准备头文件、命名空间
#include<bits/stdc++.h>
using namespace std;
2.2变量、main函数设置
int n;
//dfs函数
int main(){
cin>>n;
dfs(n,'a','b','c');
return 0;
}
2.3dfs函数设置
void dfs(int n,char a,char b,char c) {
if(n==1){
cout<<A<<"->"<<n<<"->"<<C<<endl;
return;
}
dfs(n-1,a,c,b);
cout<<a<<"->"<<n<<<"->"<<c<<endl;
dfs(n-1,b,a,c);
}
3.最终代码
#include<iostream>
using namespace std;
void dfs(int n,char a,char b,char c) {
if(n==1){
cout<<a<<"->"<<n<<"->"<<b<<endl;
return;
}
dfs(n-1,a,c,b);
cout<<a<<"->"<<n<<"->"<<b<<endl;
dfs(n-1,c,b,a);
}
int main(){
int n;
cin>>n;
dfs(n,'a','b','c');
return 0;
}