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

那就要来枚举咯……

代码

猜你喜欢

转载自www.cnblogs.com/send-off-a-friend/p/11706474.html