C++非递归解决汉诺塔问题

本文介绍了使用非递归方法解决汉诺塔问题的思路,通过顺序栈SeqStack来管理三个塔的状态,避免大盘子放在小盘子上。作者提醒读者注意,随着盘子数量增加,移动次数呈指数增长。详细代码展示了SeqStack的定义和汉诺塔问题的主要操作函数,包括将盘子从A塔移动到B塔、C塔等不同情况的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

汉诺塔问题简述:将塔A上的n个大小不一的盘子借由塔B全部移动到塔C上,且在过程中不能将大盘子放在小盘子上。

 

                 目录

1.算法:

2.具体效果:

3.SeqStack.cpp文件

4.Hanoi_main.cpp文件


汉诺塔问题虽然是经典的用递归方法求解的一个问题,但是对于一个看见递归就脑阔疼的人来说,还是想走走其他的路,因此我选择使用非递归来解决这个问题,具体如下:

算法:

不要问为什么可以这样做,问就是有一个美国学者研究表明 

具体效果:

 

PS:千万别把n设置的过大,输出不完的,因为要2^n-1次移动才能完成任务,当n=10的时候就已经要进行1023次移动了。 

详细代码如下:

SeqStack.cpp文件

主要任务:定义一个顺序栈,并且稍微修改其getTop()函数(与数据结构教材中定义的get函数一点点不同),设置当top指针指向-1时,调用getTop()函数则会返回999,避免塔已经空了还在移动空气到另外一个塔上。在后面的函数时会用到。

const int StackSize = 100;			//设置储存数组的大小为100
template <class DataType>
class SeqStack
{
public:
	SeqStack();						//初始化一个空栈,存储数组中什么都没有,令top=-1
	~SeqSt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值