• 多柱汉诺塔问题“通解”——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到底是多少呢?

    那就要来枚举咯……

    代码

  • 相关阅读:
    js中的异常处理
    CSS3之box-sizing属性
    AJAX
    NaN与Null与undefiined的关系
    跳转语句之continue与break
    npm火速上手
    程序里面的‘脑筋急转弯’
    css伪元素::before与::after
    常用正则表达式、JS中的正则以及ES6的扩展
    git
  • 原文地址:https://www.cnblogs.com/send-off-a-friend/p/11706474.html
Copyright © 2020-2023  润新知