话说"汉诺塔"--成功与否只是第一步--非递归解

来源:互联网 发布:第一次啪啪你多大知乎 编辑:程序博客网 时间:2024/04/28 00:02

小时候玩过汉诺塔,不过当时比较蠢,并且也没有哪个耐力在那里挪来挪去。应该是大一,C语言中递归函数时候第一次接触了用程序解决这个问题。那时候感觉这个东西有点玄妙,毕竟自己是个"C鸟",再加上自己本来就不熟悉,弄得蛮纠结。确切的说知道现在我还没有运行过这个程序,不过昨天看了一下,发现了一个不用递归就能够解决的方法。

总之,汉诺塔能否成功玩出就只是第一步决定的。

这个想法是根据递归的汉诺塔解法发现的规律,假设柱子有三A,B,C,现在要将N个盘子从A移到C,这是个简单的描述。那么我们递归的解决应该是:如果先把N-1个盘子从A移到B那我就可以完成剩下来的一步了。这不就把责任推给别人了吗?接着我们要将N-1个盘子从A移动到B那只需要将N-2这盘子从A移动到C,好了,到这里我们的解出来了。原来N的操作和N-2的操作时同一个性质的,所以我们能够得出结论:任何N的移动规则都是与N%2的移动规则相同的,也就是说,如果N是奇数那么移动和1个盘子情况相同,如果为偶数移动和2个盘子相同。如果该柱子盘子数目为奇数将盘子直接移动到最终要去的柱子,如果该柱子盘子数目为偶数将盘子先移动到另外的一个柱子。如果是从上开始一步一步迭代的话,需要有一个环节,每移动1个盘子就要把所有比他小的盘子移动到它的上面。这样子循环进行就能得到正确步法。

这个程序实现起来感觉应该不是很困难,三个栈作为辅助空间差不多就可以了,每次移动之后,窥探各个栈中小余该盘子的盘子然后弹出到队列以同样的判断方式(奇数偶数)决定,出栈盘子走向。不过就是有点复杂,不过跟人吹牛说自己连想都不想就能够出十多个盘子的就没什么问题了!

据我不完全统计,貌似没什么错。可能比较小儿科,不过感觉这也算是饭后的甜点,乐呵乐呵罢了。

欢迎高手拍砖指教,小弟还是个"鸟" !

转载请注明出处!