例1.11 新汉诺塔问题 A Different Task UVA - 10795 中间状态+逆向思维

该博客探讨了UVA - 10795 中的新汉诺塔问题,从初状态到目标状态求解最少移动步数。通过分析发现,当最大盘子已位于目标位置时,只需关注次大盘子。提出利用中间状态和逆向思维,将问题转换为求解较小规模汉诺塔问题,并给出求解步数的方法。最终通过代码实现问题的解答。
摘要由CSDN通过智能技术生成

传送门

题目大意:标准的汉诺塔上有n个盘子,然后给定两个状态,初状态和目标状态,即每个盘子的位置。求出初装态到目标状态需要最少的步数

解题思路:汉诺塔问题我们知道,1,2,3,4。。。个盘子移动到另一个柱子需要的步数为:1,3,7,15,,,,即前一项的两倍再加一。在考虑另一个问题,当最大的盘子在目标位置时就不需要移动,那么就找第二小的盘子,找到一个盘子时,那这个盘子就是需要移动的最大的盘子,但这个盘子在1号柱子,目标时2号柱子时,剩下的盘子只能在3号柱子上,那么这个状态必须有,而且汉诺塔游戏中,从初始状态到一个状态,也可以从这个状态到初始状态,而且步数相同。那我们就可以把3号柱子此时的状态作为中间状态,他恢复到初始状态的步数+他到目标状态步数+1(需要移动的最大的盘子,从1号柱子移动到2号柱子)就是要求的答案。这就转化成了都在一个柱子上,然后把相应的盘子移动到相应的柱子上的问题,按照之前的办法,找到最大的需要移动的盘子,把上面所有的盘子移动到另一个柱子上再加一即可,而我们移动n个盘子需要的步数查表就可得出。


AC代码:

#include <iostream>
#include <cstdio>

using nam
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值