递归求解汉诺塔问题(C++)

递归求解汉诺塔问题(C++)

【问题描述】
Hanoi(汉诺)塔问题。这是一个经典的数学问题:古代有一个梵塔,塔内有3个座A,B,C,开始时A座上有64 个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到C座,但每次只允许移动个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在E移动过程中可以利用B座,要求编写程序打印出若只有n个盘子时移动的步骤。

【问题分析】
1.假设最开始A座上有n个盘子,如果我们能够将最下面的盘子通过B座移到C座上,则我们只需要再把A座上的n-1个盘子全部挪到C座即可。
2.要将最下面的盘子移到C座上,则必须先将上边的n-1个盘子通过C座挪到B座上,再把最大的盘子直接挪到C座即可。
3.然后再将B座上的n-1个盘子通过A座挪到C座上即可,这样就实现了一个递归。

【代码实现】

#include <iostream>
using namespace std;
int main()
{
	void hnt(int n,char a,char b,char c);
	int num;
	char a,b,c;
	a='A';
	b='B';
	c='C'; 
	cin>>num;
	hnt(num,a,b,c);
	return 0;
}
void hnt(int n,char a,char b,char c)
{
	if(n==1) cout<<a<<"--->"<<c<<endl;
	else
	{hnt(n-1,a,c,b);
	hnt(1,a,b,c);
	hnt(n-1,b,a,c);
	}
}

若要求再对盘子进行编号,实现代码如下:

#include <iostream>
using namespace std;
void Move(int n,char x,char y)
{
   cout<<x<<"->"<<n<<"->"<<y<<endl;
}
void Hannoi(int n,char a,char c,char b)
{
	if(n==1) Move(1,a,b);
    else
    {Hannoi(n-1,a,b,c);
    Move(n,a,b);
    Hannoi(n-1,c,a,b);
    }
}
int main()
{
	int n;
	char a,b,c;
  	cin>>n>>a>>b>>c;
    Hannoi(n,a,c,b);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

使君杭千秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值