算法实验题3.2 单柱Hanoi塔问题(选择排序 or 搜索+估价剪枝[IDA*])


题目描述

在一个塔座上有一叠大小不等的共n 个圆盘。各圆盘从小到大编号为1,2,……,n。

初始时,这些圆盘自下而上散乱地叠在一起。现要求按照以下翻转规则,经若干次翻转,将塔座上的这一叠圆盘排好序,即按自底向上,从大到小的顺序叠置。

翻转规则:每次可以将最顶上的若干圆盘翻转,即按其相反的次序叠置。

例如,在下面的 3个圆盘叠置状态中,中间状态是在左边状态中第3 个圆盘以上所有圆盘翻转后得到的,相应翻转记为flip(3);右边状态是将中间状态中第1个圆盘以上所有圆盘翻转得到的,相应翻转记为flip(1)。
846752 − − > 764852 − − > 258467 8 4 6 7 5 2 --> 7 6 4 8 5 2 --> 2 5 8 4 6 7 846752>764852>258467

实验任务
对于给定的大小不等的n个圆盘的初始状态,用翻转运算将n 个圆盘排序。
数据输入
由文件input.txt给出输入数据。第 1 行是给定的圆盘自顶向下的初始状态。
结果输出:
将排序所用的翻转运算依次输出到文件 output.txt。输出翻转运算flip(i)时,只要输出数
字i即可,相邻数字用空格分隔。
输入文件示例 输出文件示例
input.txt
5 1 2 3 4
output.txt
1 2


思路

实际上就是《编程之美》书中介绍的"一摞烧饼排序",最直观的思路就是每次找到最大的下标将其翻转到最上方后再翻转到最下方,于是对于n规模的Hanoi最多只会翻转 2 ∗ ( n − 1 ) 2*(n-1) 2(n1)次。但发现复杂度为 O ( n 2 ) O(n^2) O(n2)。并且翻转的次数可能会多于最优解,即输出序列可能会和答案不一致(这只是可行解)。

关于最优解我们可以利用爆搜穷举出所有方案,复杂度为 O ( n ! ) O(n!) O(n!),虽然能够找到最优解但复杂度不能接受。我们可以用两个估价函数分别算出剩余要交换的塔的最小交换上界 2 ∗ ( i − 1 ) 2*(i-1) 2(i1)和最少交换下界(相邻两个是否最终相邻),来判断剩余的步骤与目前的交换数之和是否会大于上一个可行解,是则剪枝,这种基于DFS的估价函数剪枝似乎又称为IDA*。


实现

由于在《编程之美》中已有详细的讲解及代码,以后有时间再来填上这个坑。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小胡同的诗

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

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

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

打赏作者

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

抵扣说明:

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

余额充值