Hanoi塔问题图文详解

汉诺塔问题
问题描述
设A、B、C是3个塔座。开始时,在塔座A上有一叠共n个圆盘,这些圆盘自下而上,由小到大地叠放在一起。各圆盘从小到大的编号为1,2,…,n。现要求将塔座A上的这一叠圆盘移动到塔座B上,并仍按同样顺序叠置。在移动圆盘时应遵守以下移动规则:
规则1:每次只能移动1个圆盘;
规则2:任何时刻都不允许将较大的圆盘压在较小的圆盘之上;
规则3:在满足移动规则1~3的前提下,可将圆盘移至A、B、C中任一塔座上。

试设计一个算法,用最少的移动次数将塔座A上的n个圆盘移动到塔座B上,并仍按同样顺序叠置。
解题思路
1、如果只有一个圆盘的话,那我们只需要把这唯一的一个圆盘从A移动到B上。

2、如果有n个圆盘,那我们可以把问题规模缩小,看看如果只有n-1个圆盘的话怎么移动,想n-1个圆盘怎么移动时,可以考虑n-2个怎么移动…这样一直缩小问题规模直到缩小到n=1。这个思路可以运用递归来解决,n=1就是递归的边界。

3、要将A塔座上的圆盘全部移动到B塔座上,中间必定要有一步是原本A塔座上面的n-1个圆盘全部移动到了C塔座上,然后就可以将A塔座上的最后一个圆盘n移动到B塔座上,然后就可以再把C上的n-1个圆盘移动到B上。然后再考虑那n-1个是怎么从A移动到C的。
在这里插入图片描述
解题代码

#include<iostream>
using namespace std;
void Hannoi(int,char,char,char);
int main()
{
	int n;
	cin>>n;
	Hannoi(n,'A','B','C');
	return 0;
} 
void Move(int i,char M,char N)
{   //打印:把第i层塔从M位置移动到N位置
	cout<<i<<' '<<M<<' '<<N<<endl;  
}
void Hannoi(int n,char W1,char W2,char W3)
{
	if(n==1)
	{//如果只有一个圆盘,则直接从A移动到B
		Move(1,W1,W2);
		return;
	}
	n--;
	Hannoi(n,W1,W3,W2);//考虑A上面的n-1个圆盘是怎么从A移动到C的
	Move(n+1,W1,W2);//第n个从A到B(此处的n+1就是n,前面做了n--)
	Hannoi(n,W3,W2,W1);//考虑C上面的n-1个圆盘怎么从C移动到B上(此处的n就是n-1,前面做了n--)
}

运行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值