ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何用VBA解决汉诺塔问题?

如何用VBA解决汉诺塔问题?

作者:绿色风 分类: 时间:2022-08-17 浏览:138
楼主
wise
Q:如何用VBA解决汉诺塔问题?
汉诺塔(又称河内塔)问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。面对庞大的数字(移动圆片的次数)18446744073709551615,看来,众僧们耗尽毕生精力也不可能完成金片的移动。
后来,这个传说就演变为汉诺塔游戏:
1、有三根杆子A,B,C。A杆上有若干碟子
2、每次移动一块碟子,小的只能叠在大的上面
3、把所有碟子从A杆全部移到C杆上
经过研究发现,汉诺塔的破解很简单,就是按照移动规则向一个方向移动金片:
如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C
汉诺塔问题所有程序设计中的经典递归问题。
以前学C++及C语言都涉及这些方面的东西。
A:按ALT+F11进入VBE窗口,代码如下:
  1. Dim Counter As Integer

  2. Sub GetMove()
  3.     Dim n As Long
  4.     On Error Resume Next
  5.     n = Application.InputBox(Prompt:="请输入一个代表要移动盘子的数量值:", _
  6.                                   Title:="汉诺塔问题", _
  7.                                   Type:=2)
  8.     Call Move(n, "A", "B", "C")
  9. End Sub

  1. Sub Move(ByVal nValue As Long, ByVal A As String, ByVal B As String, ByVal C As String)
  2.         If nValue = 1 Then
  3.             Counter = Counter + 1
  4.             Debug.Print Counter & ":" & "将盘" & "1" & ":" & "从柱" & A & "移到柱" & C
  5.         Else
  6.             Call Move(nValue - 1, A, C, B)
  7.             Counter = Counter + 1
  8.             Debug.Print Counter & ":" & "将盘" & nValue & ":" & "从柱" & A & "移到柱" & C
  9.             Call Move(nValue - 1, B, A, C)
  10.         End If
  11. End Sub
2楼
水星钓鱼
留个脚印

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap