社区
数据结构与算法
帖子详情
汉诺塔的确切解
逆向菜鸟
2016-06-11 12:33:42
http://www.mathchina.com/bbs/forum.php?mod=viewthread&tid=40607&extra=page%3D1&page=1
数学中国论坛发布的一个帖子,汉诺塔的确切解……大家给点意见。
...全文
300
5
打赏
收藏
汉诺塔的确切解
http://www.mathchina.com/bbs/forum.php?mod=viewthread&tid=40607&extra=page%3D1&page=1 数学中国论坛发布的一个帖子,汉诺塔的确切解……大家给点意见。
复制链接
扫一扫
分享
转发到动态
举报
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
打赏
举报
回复
怎么没人。 这是我今早做梦梦到自己在玩汉诺塔游戏,早上起来后,边推导边发布的。
汉诺塔
递归与非递归两种算法的代码与结果对比
汉诺塔
递归与非递归结果对比,结果是no differences,说明非递归算法没错。递归算法参考了csdn另一名博主的博客。
非递归
解
决
汉诺塔
,每一步都有
确切
解
(奇数版)望老师指正-陈墨仙-西瓜西米露-20190924.rar
非递归
解
决
汉诺塔
,每一步都有
确切
解
(奇数版)望老师指正-陈墨仙-西瓜西米露-20190924
2023年算法设计与分析期末考试1-2章试题
解
析
针对本校的期末考试对考试题库即相应范围的分析
信息学入门
算法入门希望对那些刚入门的acm有帮助
话说"
汉诺塔
"--成功与否只是第一步--非递归
解
小时候玩过
汉诺塔
,不过当时比较蠢,并且也没有哪个耐力在那里挪来挪去。应该是大一,C语言中递归函数时候第一次接触了用程序
解
决这个问题。那时候感觉这个东西有点玄妙,毕竟自己是个"C鸟",再加上自己本来就不熟悉,弄得蛮纠结。
确切
的说知道现在我还没有运行过这个程序,不过昨天看了一下,发现了一个不用递归就能够
解
决的方法。总之,
汉诺塔
能否成功玩出就只是第一步决定的。这个想法是根据递归的
汉诺塔
解
法发现的
数据结构与算法
33,027
社区成员
35,335
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章