论文部分内容阅读
今天,我们再做三个游戏。
为游戏实用和运行时动态图清晰,建议盘数m不大于8。到带[*]的语句止,显示出搬运开始前的图像,并给下标为各个盘号的数组q$都赋以字符“A”。在单重n循环内操作每一次搬动,算法依前面分析出的四条规律而生,请读者仔细体会。这里n代表正在搬第几次,k代表盘号,q$数组内存入的是运行中每一次新的搬动前各盘所在的位置(用字符A、B、C表示)。每确定一次搬动的起终位置(比如A和B),就将这两个字符存入下标为n值的数组s1$和s2$中,想要随时或者最后输出结果都行。图5为m=5时的运行结果(为省篇幅,程序中略去了打印输出语句)。
子程序subl用来完成盘子搬运的动画过程。数组x记入三根柱子的水平方向坐标,而数组p记人每次搬动前各个柱上的盘子数目,为了运算操作,用u1和u2代表每次搬动时起终位置的柱号(1、2和3,对应于A、B和C),通过计算找到每次应搬动的盘,抹去于原位,添加于新位。
汉诺塔问题是一个数学名题。相传在古印度北方的一座圣殿中,僧侣们忙碌地在三个塔柱间搬运着64个金盘。据称,当任务完成时,喜马拉雅山将变为金山。算一算,他们搬动金盘的总次数应该为264-1=18446744073709551615次,即使快捷到1秒钟搬一次,也需要5800亿年!
求解汉诺塔问题用递归算法最佳,程序简单解题迅速,但游戏味不够。在许多高级语言的教材中可以见到,读者应该找来看看。要是你能把今天我们的程序改动一番,使得每次盘的移动可以人为掌控。做出一个汉诺塔玩具来,那就更有意思啦!
为游戏实用和运行时动态图清晰,建议盘数m不大于8。到带[*]的语句止,显示出搬运开始前的图像,并给下标为各个盘号的数组q$都赋以字符“A”。在单重n循环内操作每一次搬动,算法依前面分析出的四条规律而生,请读者仔细体会。这里n代表正在搬第几次,k代表盘号,q$数组内存入的是运行中每一次新的搬动前各盘所在的位置(用字符A、B、C表示)。每确定一次搬动的起终位置(比如A和B),就将这两个字符存入下标为n值的数组s1$和s2$中,想要随时或者最后输出结果都行。图5为m=5时的运行结果(为省篇幅,程序中略去了打印输出语句)。
子程序subl用来完成盘子搬运的动画过程。数组x记入三根柱子的水平方向坐标,而数组p记人每次搬动前各个柱上的盘子数目,为了运算操作,用u1和u2代表每次搬动时起终位置的柱号(1、2和3,对应于A、B和C),通过计算找到每次应搬动的盘,抹去于原位,添加于新位。
汉诺塔问题是一个数学名题。相传在古印度北方的一座圣殿中,僧侣们忙碌地在三个塔柱间搬运着64个金盘。据称,当任务完成时,喜马拉雅山将变为金山。算一算,他们搬动金盘的总次数应该为264-1=18446744073709551615次,即使快捷到1秒钟搬一次,也需要5800亿年!
求解汉诺塔问题用递归算法最佳,程序简单解题迅速,但游戏味不够。在许多高级语言的教材中可以见到,读者应该找来看看。要是你能把今天我们的程序改动一番,使得每次盘的移动可以人为掌控。做出一个汉诺塔玩具来,那就更有意思啦!