作者:绿色风
分类:
时间: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窗口,代码如下:
- Dim Counter As Integer
- Sub GetMove()
- Dim n As Long
- On Error Resume Next
- n = Application.InputBox(Prompt:="请输入一个代表要移动盘子的数量值:", _
- Title:="汉诺塔问题", _
- Type:=2)
- Call Move(n, "A", "B", "C")
- End Sub
- Sub Move(ByVal nValue As Long, ByVal A As String, ByVal B As String, ByVal C As String)
- If nValue = 1 Then
- Counter = Counter + 1
- Debug.Print Counter & ":" & "将盘" & "1" & ":" & "从柱" & A & "移到柱" & C
- Else
- Call Move(nValue - 1, A, C, B)
- Counter = Counter + 1
- Debug.Print Counter & ":" & "将盘" & nValue & ":" & "从柱" & A & "移到柱" & C
- Call Move(nValue - 1, B, A, C)
- End If
- End Sub
|
2楼 水星钓鱼 |
留个脚印 |
免责声明
有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素,
经与ExcelTip.Net站长Apolloh商议并征得其同意,
现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示,
供有需要的人士查询使用,也慰缅曾经的论坛时代。
所示各个帖子的原作者如对版权有异议,
可与本人沟通提出,或于本站点留言,我们会尽快处理。
在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一