zoukankan      html  css  js  c++  java
  • 多柱汉诺塔问题“通解”——c++

    多柱汉诺塔问题

    绪言

    有位同学看到了我的初赛模拟卷上有一道关于汉诺塔的数学题。大概就是要求4柱20盘的最小移动次数。

    他的数学很不错,找到了应该怎样推。

    如果要把n个盘子移到另一个柱子上,步骤如下:

    1. 把一部分盘子(靠上的r个)移到一根空柱子上,移动过程中可用的柱子有4根
    2. 将剩下的n-r个盘子移到另一根空柱子上,移动过程中可用的柱子为3根(这n-r个盘子都不能放在放有前r个盘子的柱子上)
    3. 将第一步移动的r根柱子移到n-r个盘子上方,移动过程中可用的柱子有4根

    其实,他说的就是多柱汉诺塔的Frame-Stewart算法的m=4时的情况

    Frame-Stewart算法

    设原来有n个盘子,m个柱子

    把一部分盘子(靠上的r个)移到一根空柱子上,移动过程中可用的柱子有m根

    将剩下的n-r个盘子移到另一根空柱子上,移动过程中可用的柱子为m-1根(这n-r个盘子都不能放在放有前r个盘子的柱子上)

    将第一步移动的r根柱子移到n-r个盘子上方,移动过程中可用的柱子有m根

    推导式

    设Fm(n)=有m个柱子,n个盘子所需要移动的最小步数。

    Fm(n)=min0<r<n{2*Fm(r)+Fm-1(n-r)}

    那么这个r到底是多少呢?

    那就要来枚举咯……

    代码

  • 相关阅读:
    使用博客园平台写文章赚外快的实践
    博客换来的不仅仅是评论,还有Money!!!
    软件测试方法和规则
    向string,int,类对象等中扩展方法
    江苏省计算机三级偏软知识点整理
    MVC是什么
    ASP.NET关于session的用法
    ASP.Net 中Application的用法
    什么是单件模式
    输入法中全角和半角的区别
  • 原文地址:https://www.cnblogs.com/send-off-a-friend/p/11706474.html
Copyright © 2011-2022 走看看