汉诺塔的确切解

逆向菜鸟 2016-06-11 12:33:42
http://www.mathchina.com/bbs/forum.php?mod=viewthread&tid=40607&extra=page%3D1&page=1


数学中国论坛发布的一个帖子,汉诺塔的确切解……大家给点意见。
...全文
297 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
FancyMouse 2016-06-29
  • 打赏
  • 举报
回复
>=4根柱子的最优解是未解决问题。lz真要觉得自己解决了,去发表论文,我们去看论文。要是连论文都发表不出来说明做法肯定是错的。
梵高先生2015 2016-06-12
  • 打赏
  • 举报
回复
排版有点乱,而且太长,实在看不下去。。。 不过这游戏我好像初中就玩通了,思路就是递归的思想: 要想把n层的盘从1->3,就必须把其上的(n-1)层从1->2;要想把(n-1)层从1->2,就必须把其上的(n-2)层从1->3,……按照如此思路,便可总结出移动的规律。 楼主想表达的是这个意思吗???
逆向菜鸟 2016-06-11
  • 打赏
  • 举报
回复
原贴有bug,编辑一下重发。谢绝转载,作者高冷宅小胖妞(陈墨仙)。原发布网站,数学中国论坛。原贴地址http://www.mathchina.com/bbs/forum.php?mod=viewthread&tid=40607&extra=&page=1 大家好,我叫陈墨仙,毕业于西安电子科技大学,就职于网龙天晴在线任务设计部,是一名脚本程序员 (服务器端)。 我似乎发现了汉诺塔的确切解。目前先把猜想发上来,一会儿我将写一个程序来证明。 假设 1 2 3 —— —— —— 1柱子 2柱子3柱子 要把这1到3号从1柱子移到3柱子。 目标柱子:3 本身柱子:1 中间柱子:2 本身柱子上的数量是3。 3mod2=1 所以第一个1号盘子,要移到目标柱子上。 2 3 1 —— —— —— 1柱子 2柱子3柱子 接下来,目标柱子是空的,本身柱子上的数量是2。 2mod2=0 所以本身柱子上,最上面的2号盘,要移到中间柱子上。 3 2 1 —— —— —— 1柱子 2柱子3柱子 接下来,目标柱子和中间柱子都有盘子。本身柱子1上的数量为1。 1mod2=1。 所以目前要把目标柱子上的盘子往中间柱子移。 这时候, 第二层 目标柱子:2 本身柱子:3 中间柱子:1 本身柱子3上的数量为1, 1mod2=1 所以要把3柱子上的1号盘子往目标柱子上移。 1 3 2 —— —— —— 1柱子 2柱子3柱子 等到第二层本身柱子3空了,又恢复成 目标柱子:3 本身柱子:1 中间柱子:2 好了,目前本身柱子上的盘子数量为1 1mod2=1。 所以1柱子上的3盘子,要移到目标柱子3上。 1 2 3 —— —— —— 1柱子 2柱子3柱子 这时候,本身柱子1空了,目标,本身,中间再次变化。 本身柱子:2 目标柱子:3 中间柱子:1 本身柱子盘子数量2, 2mod2=0 所以2号柱子上的1号盘子,要移到中间柱子上。 1 2 3 —— —— —— 1柱子 2柱子3柱子 本身柱子盘子数量1, 1mod2=1 所以2号柱子上的2号盘子,要移到目标柱子上。 2 1 3 —— —— —— 1柱子 2柱子3柱子 本身柱子空了,本身,目标,中间柱子再次变化。 由2->3变为1->3 本身柱子1号柱子的数量为1 1mod2=1 所以,将1号柱子上的1号盘,移到目标柱子上。 1 2 3 —— —— —— 1柱子 2柱子3柱子 综上所述,若本身柱子数量对2取模,值为1,则移到目标柱子上,若值为0,则移到中间柱子上。 若本身柱子盘子数为0,则变换目标和本身,中间柱子。 1->3变为2->3 若目标柱子和中间柱子都有盘子,则进入第二层目标,本身,中间柱子。 若第一层本身柱子数量对2取模,值为1,则第二层目标柱子为第一层的中间柱子,第二层本身柱子为第 一层的目标柱子。 若值为0,则反过来。 还有一种更方便的判断方法,即看柱子上的盘子大小来判断目标柱子和本身柱子。 ============================== 我们现在来看看6个盘子的情况。 1 2 3 4 5 6 —— —— —— 1柱子 2柱子3柱子 用倒推法,要把6个盘子移到3柱子上,则 需要 1 2 3 4 6 5 —— —— —— 1柱子 2柱子3柱子 1 2 3 6 5 4 —— —— —— 1柱子 2柱子3柱子 1 5 2 6 3 4 —— —— —— 1柱子 2柱子3柱子 4 5 1 6 3 2 —— —— —— 1柱子 2柱子3柱子 2 3 4 5 6 1 —— —— —— 1柱子 2柱子3柱子 也就是说5号盘要移到2号柱子上,4号盘要移到3号柱子上,3号盘2号,2号盘3号,1号盘2号。规律是n 号盘,(6-n)mod2,若为1,则中间柱子,2号,若为0,则目标柱子,3号。 而移动的方法,就是我刚才用123个盘子进行移动的方法。 ===================== 怎么获取具体某一步的移法? 还是以6个盘子为例,假设我们想知道3号盘子第二次移动,是从哪移到哪。 首先(6-3)mod2=1,则3号盘子第一次移动应该是中间柱子,2号,即1->2 这个时候,柱子为 4 5 1 6 3 2 —— —— —— 1柱子 2柱子3柱子 那么接下来与三号盘无关的移动直到 1 5 2 6 3 4 —— —— —— 1柱子 2柱子3柱子 (3-3)mod2=0,即3号盘要移到目标柱子3号柱子。 所以3号盘第二次移动是,2->3。 ================================ 所以1号盘的第一次移动是 (6-1)mod2=1,移到中间位置,1->2 本身柱子与中间柱子互换,目标柱子不变 第二次一定是移到目标位置,2->3 本身柱子与目标柱子互换,中间柱子不变 第三次移到中间位置,3->1 本身柱子与中间柱子互换,目标柱子不变 第四次移到目标位置,1->2 也即是说奇数次,移到中间位置,偶数次移到目标位置。移动之后,本身柱子与中间或目标柱子互换身 份。 ========================================= 我们再抽象归纳一下。 6个盘子,1号盘的第n次是怎么移动的函数设为(f,k)(n) f为源位子,k为目标位子。 f(1)=1 f(n)=k(n-1) k(n)=3-((n mod 3-2)mod 3) ============================ 从上面我们可以得知,如果盘号的奇偶性一样的话,那么他们前n次移动的顺序是一样的。 所以我们又可以简化为,若总共有偶数个盘子,偶数号盘的第n次是怎么移动的。 或者,若总共有奇数个盘子,奇数号盘的第n次是怎么移动的。 k(n,总共偶数,盘号偶数)= 3-((n mod 3)-1)mod3 k(n,总共偶数,盘号奇数)= 3-((n mod 3)-2)mod3 如果总共的盘子数是奇数的话,上面的公式就要反过来。 k(n,总共奇数,盘号奇数)=3-((n mod 3)-1)mod3 k(n,总共奇数,盘号偶数)=3-((n mod 3)-2)mod3 接下来要思考如何判断总共第m步要移的是几号盘子。 假设盘子总数为max, 第一步要移的总是第一号盘子。 第二步是二号盘子。 第三步是把一号盘子移到二号盘子上。 ==以上为2号盘子以上的搬运完毕==== 第四步移三号盘子。 第五步移一号。 第六步移二号。 第七步移一号。 ===以上为3号盘子以上的搬运完毕 所以顺序是 121 3121 41213121 5121312141213121 序列 z(1)=121 z(2)=3121 z(3)=41213121 len表示长度 len(z,1)=3 len(z,n)=len(z,1)+len(z,2)+...+len(z,n-1)+1 sumlen(z,n)=len(z,1)+len(z,2)+...+len(z,n) a = m-sumlen(z,n-1) if a >0 && a<len(z,n) 则当前m在第n个序列上 if a=1 则要移动n+1号盘,是n+1号盘第一次移动 if a=len(z,n-1)+1 则要移动n号盘,是n号盘第2次移动 if m mod len(z,n-2) = 1 则要移动n-1号盘,是n-1号盘第2+floor(m mod len(z,n-2))次移动 …… if m mod len(z,1)=1 则要移动1号盘,是1号盘第n*(n-1)+floor(m mod len(z,1) )次移动 顺便打个广告,版主手下留情。 我在晋江文学城的笔名,也是我在这个论坛的id,高冷宅小胖妞。 如果大家对女频言情yy小说感兴趣的话,可以来看我的小说哦!
逆向菜鸟 2016-06-11
  • 打赏
  • 举报
回复
帖子先整理一下发在这里吧,谢绝转载,作者高冷宅小胖妞(陈墨仙)。原发布网站,数学中国论坛。原贴地址http://www.mathchina.com/bbs/forum.php?mod=viewthread&tid=40607&extra=&page=1 大家好,我叫陈墨仙,毕业于西安电子科技大学,就职于网龙天晴在线任务设计部,是一名脚本程序员 (服务器端)。 我似乎发现了汉诺塔的确切解。目前先把猜想发上来,一会儿我将写一个程序来证明。 假设 1 2 3 —— —— —— 1柱子 2柱子3柱子 要把这1到3号从1柱子移到3柱子。 目标柱子:3 本身柱子:1 中间柱子:2 本身柱子上的数量是3。 3mod2=1 所以第一个1号盘子,要移到目标柱子上。 2 3 1 —— —— —— 1柱子 2柱子3柱子 接下来,目标柱子是空的,本身柱子上的数量是2。 2mod2=0 所以本身柱子上,最上面的2号盘,要移到中间柱子上。 3 2 1 —— —— —— 1柱子 2柱子3柱子 接下来,目标柱子和中间柱子都有盘子。本身柱子1上的数量为1。 1mod2=1。 所以目前要把目标柱子上的盘子往中间柱子移。 这时候, 第二层 目标柱子:2 本身柱子:3 中间柱子:1 本身柱子3上的数量为1, 1mod2=1 所以要把3柱子上的1号盘子往目标柱子上移。 1 3 2 —— —— —— 1柱子 2柱子3柱子 等到第二层本身柱子3空了,又恢复成 目标柱子:3 本身柱子:1 中间柱子:2 好了,目前本身柱子上的盘子数量为1 1mod2=1。 所以1柱子上的3盘子,要移到目标柱子3上。 1 2 3 —— —— —— 1柱子 2柱子3柱子 这时候,本身柱子1空了,目标,本身,中间再次变化。 本身柱子:2 目标柱子:3 中间柱子:1 本身柱子盘子数量2, 2mod2=0 所以2号柱子上的1号盘子,要移到中间柱子上。 1 2 3 —— —— —— 1柱子 2柱子3柱子 本身柱子盘子数量1, 1mod2=1 所以2号柱子上的2号盘子,要移到目标柱子上。 2 1 3 —— —— —— 1柱子 2柱子3柱子 本身柱子空了,本身,目标,中间柱子再次变化。 由2->3变为1->3 本身柱子1号柱子的数量为1 1mod2=1 所以,将1号柱子上的1号盘,移到目标柱子上。 1 2 3 —— —— —— 1柱子 2柱子3柱子 综上所述,若本身柱子数量对2取模,值为1,则移到目标柱子上,若值为0,则移到中间柱子上。 若本身柱子盘子数为0,则变换目标和本身,中间柱子。 1->3变为2->3 若目标柱子和中间柱子都有盘子,则进入第二层目标,本身,中间柱子。 若第一层本身柱子数量对2取模,值为1,则第二层目标柱子为第一层的中间柱子,第二层本身柱子为第 一层的目标柱子。 若值为0,则反过来。 还有一种更方便的判断方法,即看柱子上的盘子大小来判断目标柱子和本身柱子。 ============================== 我们现在来看看6个盘子的情况。 1 2 3 4 5 6 —— —— —— 1柱子 2柱子3柱子 用倒推法,要把6个盘子移到3柱子上,则 需要 1 2 3 4 6 5 —— —— —— 1柱子 2柱子3柱子 1 2 3 6 5 4 —— —— —— 1柱子 2柱子3柱子 1 5 2 6 3 4 —— —— —— 1柱子 2柱子3柱子 4 5 1 6 3 2 —— —— —— 1柱子 2柱子3柱子 2 3 4 5 6 1 —— —— —— 1柱子 2柱子3柱子 也就是说5号盘要移到2号柱子上,4号盘要移到3号柱子上,3号盘2号,2号盘3号,1号盘2号。规律是n 号盘,(6-n)mod2,若为1,则中间柱子,2号,若为0,则目标柱子,3号。 而移动的方法,就是我刚才用123个盘子进行移动的方法。 ===================== 怎么获取具体某一步的移法? 还是以6个盘子为例,假设我们想知道3号盘子第二次移动,是从哪移到哪。 首先(6-3)mod2=1,则3号盘子第一次移动应该是中间柱子,2号,即1->2 这个时候,柱子为 4 5 1 6 3 2 —— —— —— 1柱子 2柱子3柱子 那么接下来与三号盘无关的移动直到 1 5 2 6 3 4 —— —— —— 1柱子 2柱子3柱子 (3-3)mod2=0,即3号盘要移到目标柱子3号柱子。 所以3号盘第二次移动是,2->3。 ================================ 所以1号盘的第一次移动是 (6-1)mod2=1,移到中间位置,1->2 本身柱子与中间柱子互换,目标柱子不变 第二次一定是移到目标位置,2->3 本身柱子与目标柱子互换,中间柱子不变 第三次移到中间位置,3->1 本身柱子与中间柱子互换,目标柱子不变 第四次移到目标位置,1->2 也即是说奇数次,移到中间位置,偶数次移到目标位置。移动之后,本身柱子与中间或目标柱子互换身 份。 ========================================= 我们再抽象归纳一下。 6个盘子,1号盘的第n次是怎么移动的函数设为(f,k)(n) f为源位子,k为目标位子。 f(1)=1 f(n)=k(n-1) k(n)=3-((n mod 3-2)mod 3) ============================ 从上面我们可以得知,如果盘号的奇偶性一样的话,那么他们前n次移动的顺序是一样的。 所以我们又可以简化为,若总共有偶数个盘子,偶数号盘的第n次是怎么移动的。 或者,若总共有奇数个盘子,奇数号盘的第n次是怎么移动的。 k(n,总共偶数,盘号偶数)= 3-((n mod 3)-1)mod3 k(n,总共偶数,盘号奇数)= 3-((n mod 3)-2)mod3 如果总共的盘子数是奇数的话,上面的公式就要反过来。 k(n,总共奇数,盘号奇数)=3-((n mod 3)-1)mod3 k(n,总共奇数,盘号偶数)=3-((n mod 3)-2)mod3 接下来要思考如何判断总共第m步要移的是几号盘子。 假设盘子总数为max, 第一步要移的总是第一号盘子。 第二步是二号盘子。 第三步是把一号盘子移到二号盘子上。 ==以上为2号盘子以上的搬运完毕==== 第四步移三号盘子。 第五步移一号。 第六步移二号。 第七步移一号。 ===以上为3号盘子以上的搬运完毕 所以顺序是 121 3121 41213121 5121312141213121 序列 z(1)=121 z(2)=3121 z(3)=41213121 len表示长度 len(z,1)=3 len(z,n)=len(z,1)+len(z,2)+...+len(z,n-1)+1 sumlen(z,n)=len(z,1)+len(z,2)+...+len(z,n) a = m-sumlen(z,n-1) if a >0 && a<len(z,n) 则当前m在第n个序列上 if a=1 则要移动n+1号盘,是n+1号盘第一次移动 if a=len(z,n-1)+1 则要移动n号盘,是n号盘第2次移动 if m mod len(z,n-2) = 1 则要移动n-1号盘,是n-1号盘第3+floor(m mod len(z,n-2))-1次移动 …… if m mod len(z,1)=1 则要移动1号盘,是1号盘第3*(n-1)+floor(m mod len(z,1))次移动 顺便打个广告,版主手下留情。 我在晋江文学城的笔名,也是我在这个论坛的id,高冷宅小胖妞。 如果大家对女频言情yy小说感兴趣的话,可以来看我的小说哦!
逆向菜鸟 2016-06-11
  • 打赏
  • 举报
回复
怎么没人。 这是我今早做梦梦到自己在玩汉诺塔游戏,早上起来后,边推导边发布的。

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧