🟦采用数据结构与算法中的递归来实现汉诺塔
👀👀👀实现之前我们先来了解一下汉诺塔是什么
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
(注:用数字大小来代表圆盘的大小)
汉诺塔动图:
🔮通过移动我们发现,当圆盘数为n的时候,要移动第n个圆盘,我们要依赖前面n-1个圆盘移动
,这种情况适合用递归求解
以圆盘数(n)为3来分析
1️⃣过程一:圆盘1,2从柱子a借助柱子c移动到柱子b
2️⃣过程二:圆盘3从柱子a移动到柱子c
3️⃣过程三:圆盘1,2从柱子b借助柱子a移动到柱子c
好了,现在思路🌟有了开始代码的实现
void move(int n,vector<int>& a,vector<int>& b,vector<int>& c)
{//n是圆盘个数,a是源柱子,b是中间柱子,c是目标柱子
if(n==0)
{//递归结束条件
return;
}
move(n-1,a,c,b);//n-1个圆盘从a借助c移动到b
c.push_back(a.back());//将圆盘n从a移动到c
a.pop_back();
move(n-1,b,a,c);//n-1个圆盘从b借助a移动到c
}
👆这是汉诺塔移动过程的主要代码实现(注意要以引用的方式作为函数形参)
#include<iostream>
#include<vector>
using namespace std;
void printVector(const vector<int>& v)//打印容器中的元素
{
for (vector<int>::const_iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << ' ';
}
cout << endl;
}
void Print(const vector<int>& a,const vector<int>& b,const vector<int>& c)//打印a、b、c三个容器
{
printVector(a);
printVector(b);
printVector(c);
}
void move(int n, vector<int>& a, vector<int>& b, vector<int>& c)
{
//a为源柱子 b为借柱子 c为目标柱子 n为圆盘个数
if (n == 0)//递归的结束条件
{
return;
}
move(n - 1, a, c, b);//n-1个圆盘由a借助c移动到b
c.push_back(a.back());
a.pop_back();
move(n - 1, b, a, c);//n-1个圆盘由b借助a移动到c
}
void HanoiTower(int n)
{
vector<int> a;
vector<int> b;
vector<int> c;
for (int i = n; i >= 1; i--)
{
a.push_back(i);
}
cout << "圆盘未移动:" << endl;
Print(a, b, c);
move(n, a, b, c);
cout << "圆盘移动后:" << endl;
Print(a, b, c);
}
int main()
{
HanoiTower(6);
system("pause");
return 0;
}*/
👆这是汉诺塔的整体实现
🎉这篇博客到这里就结束了,创作不易,还望各位多多支持🥰🥳😘🫶❤️
还会持续更新,跟小吉一起探索数据结构与算法的奥秘吧😘🤗