汉诺塔问题

汉诺塔问题
有三根针A,B,C。A针上有n个盘子,盘子大小不等,大的在下,小的在上,要求把这n个盘子从A针移到C针,在移动过程中可借助B针,每次只允许移动一个盘,且在移动过程中在三根针上都保持大盘在下,小盘在上。
分析:
整个过程包括三个步骤,
(1)将A上n-1个盘子移到B上(借助C针)
(2)将A针上剩下的一个盘子移到C针上
(3)将n-1个盘子从B针移到C针上(借助A针)
即每个步骤都是,将n-1个盘子从A移到B,把最下面个移到C,然后把N-2个从B移到A,第N-1个移到C,如此继续下去。
主要思想:递归
代码如下:
#include<iostream>
using namespace std;
void move(char src,char dest)
{
	cout<<src<<"-->"<<dest<<endl;
}

void hanoi(int n,char src,char medium,char dest)
{
	if(n==1)
		move(src,dest);
	else
	{
		hanoi(n-1,src,dest,medium);
		move(src,dest);
		hanoi(n-1,medium,src,dest);
	}
}

int val(int n)
{  
    int c;  
    if(n==1) 
		c=1;  
    else 
		c=2*val(n-1)+1;
    return c;
}

int main()
{
	cout<<"请输入盘子数:"<<endl; 
	int m;
	cin>>m;
	cout<<"移动过程如下:"<<endl; 
	hanoi(m,'A','B','C');
	cout<<"一共需要"<<val(m)<<"步完成。"<<endl; 
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

mypollyanna

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

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

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

打赏作者

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

抵扣说明:

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

余额充值