19 12
发新话题
打印

[原创] 直接写出移盘步骤的非递归非栈的汉诺塔算法

本主题由 System 于 2008-1-1 05:00 解除限时精华

回复 10# 的帖子

上面这个做法,是在分析中得到的。当初做这个算法的时候,写了不下百张稿纸。
等价类也是在实验结果进行比较分类中得到得。后来就成了算法中找盘号的根据。已经证明过,步骤数和盘号是满映射。
在这个树解算法中,的确就如你说的规律。后来在整理算法的时候,无意中又发现了图解算法。要比树解算法好很多,根本不用这么复杂了

[ 本帖最后由 yiyanwan77 于 2007-10-26 18:16 编辑 ]

TOP

hello,是我。看了,第一感觉你确实应该去上研究生
现在找工作对你来说的确还早,因为你还有很多数学天赋可以在读研时充分利用
而我就不行了,我觉得我的数学已经到头了,所以要在工作中踏踏实实做点工程,远离算法远离数学了
我看结论能明白,就是通过一定的算法找到通往目的地的最小路径,而这个最小路径也是唯一的,这个路径通过当前盘子上面的n-1个盘子的移动步骤数决定(大概是这个意思吧?),是个模拟人类移盘的思想的算法
但算法推导中间有一段我就是看不懂了,大概知道是干什么,看不出是怎么来的
引用:
...
移动N-J号盘子时(M<N-J<N),是步骤数必满足:2^(J+1)*K+2^J(0=<K,且(2^(J+1)*K+2^J)<=2^(N-J)),则只要满足(STEP-J) MOD 2^(J+1) =0 的步骤STEP,该步骤移动的盘子的序号必是N-J
...
而后面二叉树的用法就更不懂了,以前没接触过二叉树的用法,只是知道二叉排序树查找
有机会咱们再交流交流

TOP

回复 11# 的帖子

发现问题比解决问题重要
楼主洞察力不错嘛

TOP

回复 12# 的帖子

呵呵,上次帮我们装Ubuntu还没好好谢谢你,真不好意思!
我数学学得很差,谈数学天赋真愧不敢当。当初写这个算法全凭自己的一腔热血和强烈的兴趣,一度到了做梦都在想汉诺塔的地步。后来提到汉诺塔,心里都有怪怪的感觉。
很感谢你认真看了我的算法,你提出最小路径的解法我都没想到过,仔细想想,非常有道理。
因为是半年前写的,现在有忙着考研准备。自己写的东西都有点忘了,也看了半天才想起来。
上面那段证明原来写错了,我改回来了。应该是移动N-J号盘子时(M<N-J<N),是步骤数必满足:2^(J+1)*K+2^J(0=<K,且(2^(J+1)*K+2^J)<=2^(N-J)),则只要满足(STEP-2^J) MOD 2^(J+1) =0 的步骤STEP,该步骤移动的盘子的序号必是N-J
原因我加到原帖子上面。

谢谢!

TOP

回复 13# 的帖子

发现问题能力也一般,想出树解汉诺塔算法大概用了6天时间,到用C++实现花了十多天!
有的时候就一小段代码犯了很低级的错误,往往花了几个小时的时间才发现!
编程太累了,呵呵!

[ 本帖最后由 yiyanwan77 于 2007-10-27 09:39 编辑 ]

TOP

回复 12# 的帖子

对了,二叉数的表示,其实也是树解汉诺想出来后,分析结果总结出来的。
并不是一开始就想到用二叉树来解。
第一张图是原始的移动图,每一层就是一个大步的移动步骤,很明了,但相对来讲第二张图好一些,规律能很方便体现出来。根是一,然后衍生出所有的步骤。当时画出来的时候,真有点一生二,二生三,三生万物的感觉,呵呵!

TOP

顶 顶

!!!!

TOP

牛人

真是厉害,呵呵,顶!!!!

TOP

数学人啊

TOP

 19 12
发新话题