c++实现汉诺塔

🟦采用数据结构与算法中的递归来实现汉诺塔

👀👀👀实现之前我们先来了解一下汉诺塔是什么

汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

dca3c0b341184e76af9ed4676444d4cc.png

注:用数字大小来代表圆盘的大小)

汉诺塔动图:

汉诺塔小游戏和递归思想_哔哩哔哩_bilibili

🔮通过移动我们发现,当圆盘数为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;
}*/

👆这是汉诺塔的整体实现

🎉这篇博客到这里就结束了,创作不易,还望各位多多支持🥰🥳😘🫶❤️

还会持续更新,跟小吉一起探索数据结构与算法的奥秘吧😘🤗

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值