汉诺塔移动

【问题描述】

古代有一个梵塔,塔内有3个座位A,B,C,开始时A座上有m个盘子,盘子的大小不等,大的在下,小的在上,有一个老和尚想把这m个盘子从A座移到C座,但每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动的过程中可以利用B座。请用子函数的形式模拟汉诺塔的移动过程。

【输入形式】

输入盘子的数量m,(10≥m≥2)

【输出形式】

输出盘子移动的步骤
【样例输入】

2
【样例输出】

A–>B

A–>C

B–>C
【样例说明】先将A上的一个盘子移动到B上,再将A上剩下的那个盘子移动到C上,最后将B上的盘子移动到C上,保持了小盘在上,大盘在下。

参考主程序代码:

int main()

{

int number;

cin >> number;

Hanoi(number);

return 0;

}


思路(递归):无论有多少盘子都可分为两部分移动,即将最后一个盘子移动到目标座位和前面所有盘子移动到借助座位再移动到目标座位
假设有n个盘子
1、把n-1个盘子从起点盘移动到(当前)没有任何盘子的借助座位
2、把最后一个盘子从起点座位移动到目标座位
3、把n-1个盘子从借助座位移动到目标座位(模仿1和2的操作方法来实现)


#include<iostream>
using namespace std;
int main()                //主函数
{
	int Hanoi(int x);
	int number;
	cin>>number;
	Hanoi(number);
	return 0;
}
int Hanoi(int x)   //定义汉诺塔函数
{
	void move(int x,char a,char b,char c);  //移动函数的声明
	move(x,'A','B','C');   //函数移动
	return 0;
}
void move(int x,char a,char b,char c)   //定义移动函数
{
//x表明盘子数,a表示起始的盘子处于的座位,b表示借助座位,c表示目标座位
	if(x==1) cout<<a<<"-->"<<c<<endl;
	//当盘子数为1时,直接从初始座位移至目标座位
	else   //盘子数不为1时
	{
		move(x-1,a,c,b);  //先将前x-1个盘子移动到借助座位
		//此时为将盘子移至借助座位,所以借助座位变为目标座位
		//而利用最终的目标座位进行移动,所以最终的目标座位变为借助座位
		cout<<a<<"-->"<<c<<endl;  //将最后一个盘子直接移动到目标座位的输出
		move(x-1,b,a,c);  //最后将前x-1个盘子移动到目标座位
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值