【无标题】

一、汉诺塔问题

  有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘; 大盘不能叠在小盘上面。 提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。

 问:如何移?最少要移动多少次?

#include<bits/stdc++.h>
using namespace std;
void h(int n,char a,char b,char c)//第一个(a)是出发点,第二个(b)是帮助点,第三(c)个是目标点。
{
	if(n==1)
		cout<<n<<":"<<a<<"->"<<c<<endl;
	else
	{
		h(n-1,a,c,b);//从a点出发,借助b,到c。
		cout<<n<<":"<<a<<"->"<<c<<endl;
		h(n-1,b,a,c);
	}
}
int main()
{
	int n;
	char X,Y,Z;//X是出发,Y是目标,Z是帮助。
	cin>>n>>X>>Y>>Z;
	h(n,X,Y,Z);
	return 0;
}

附图:                                      

本题思路:​在正式讲解汉诺塔问题之前,最好自己去玩一玩,看能不能找出其中的规律,如果五个圆盘玩不了,那就那叠三个圆盘来玩一玩,总之,一定要去玩一玩,并试着去找出规律,才会理解下面是在讲什么。如果只有一个盘子的话,那就直接输出移的过程。

if(n==1)
		cout<<n<<":"<<a<<"->"<<c<<endl;

如果不是,那就首先将n-1个盘子挪开,给n号盘(最大盘)移出位置,再让 n移到目标点,再将n-1个盘子移到n之上。

else
	{
		h(n-1,a,c,b);
		cout<<n<<":"<<a<<"->"<<c<<endl;
		h(n-1,b,a,c);
	}

重复此操作,逐步缩小问题的范围。将这个思路制成一个函数,在递归里调用这个函数。

在主函数里,就可以直接调用函数了。

	h(n,X,Y,Z);

   

 

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值