(聪明人进),汉诺塔问题:有10个盘子,需要移动多少步,为什么

作者&投稿:地畅 (若有异议请与网页底部的电邮联系)
汉诺塔该怎么玩,方法~

汉诺塔算法介绍:
一位美国学者发现的特别简单的方法:只要轮流用两次如下方法就可以了。
把三根柱子按顺序排成“品”字型,把所有圆盘按从大到小的顺序放于柱子A上,根据圆盘数量来确定柱子排放的顺序:
n若为偶数的话,顺时针方向依次摆放为:ABC;而n若为奇数的话,就按顺时针方向依次摆放为:ACB。这样经过反复多次的测试,最后就可以按照规定完成汉诺塔的移动。
因此很简单的,结果就是按照移动规则向一个方向移动金片:
如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C。

扩展资料:
汉诺塔经典题目:
三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,且每次移动同一根柱子上都不可以出现大盘子在小盘子上方的情况。
至少需要几次移动的问题,我们设移动次数为H(n)。
把上面n-1个盘子移动到柱子C上,把最大的一块放在B上,把C上的所有盘子移动到B上,由此我们得出表达式:
H⑴ = 1
H(n) = 2*H(n-1)+1 (n>1)
很快我们就可以得到H(n)的一般式为:
H(n) = 2^n - 1 (n>0)
且这种方法的确是最少次数的,证明非常简单,可以尝试从2个盘子的移动开始证,可以试试。
进一步加深问题:
假如现在每种大小的盘子都有两个,并且是相邻的,设盘子个数为2n,问:⑴假如不考虑相同大小盘子的上下要几次移动,设移动次数为J(n);⑵只要保证到最后B上的相同大小盘子顺序与A上时相同,需要几次移动,设移动次数为K(n)。
⑴中的移动相当于是把前一个问题中的每个盘子多移动一次,也就是:
J(n) = 2*H(n) = 2*(2^n - 1) = 2^(n+1)-2
在分析⑵之前,我们来说明一个现象,假如A柱子上有两个大小相同的盘子,上面一个是黑色的,下面一个是白色的,我们把两个盘子移动到B上,需要两次。
盘子顺序将变成黑的在下,白的在上,然后再把B上的盘子移动到C上,需要两次,盘子顺序将与A上时相同,由此我们归纳出当相邻两个盘子都移动偶数次时,盘子顺序将不变,否则上下颠倒。
回到最开始的问题,n个盘子移动,上方的n-1个盘子总移动次数为2*H(n-1),所以上方n-1个盘子的移动次数必定为偶数次,最后一个盘子移动次数为1次。
讨论问题⑵:
综上可以得出,要把A上2n个盘子移动到B上,可以得出上方的2n-2个盘子必定移动偶数次,所以顺序不变,移动次数为:
J(n-1) = 2^n-2
然后再移动倒数第二个盘子,移动次数为2*J(n-1)+1 = 2^(n+1)-3,
最后移动最底下一个盘子,所以总的移动次数为:
K(n) = 2*(2*J(n-1)+1)+1 = 2*(2^(n+1)-3)+1 = 2^(n+2)-5
参考资料:
汉诺塔(益智玩具)-百度百科

n+1个盘子的移动步数==n个盘子的移动步数*2+1
所以n个盘子最少要移动2^n-1,这道题和c++没关系吧。


#include #include int main(void){ int n; while(std::cin>>n) { std::cout<<pow(2,n)-1<<std::endl; } return 0;}

#include<iostream.h>

void hanio(int n,char,char,char);

void main()
{ char A='A',B='B',C='C';
int n=10;
hanio(n,A,B,C);
}

void hanio(int n,char A,char B,char C)
{ if(n==1)
{
cout<<"将第"<<n<<"个盘面从"<<A<<"柱搬到"<<C<<"柱上"<<endl;
}
else
{
hanio(n-1,A,C,B);
cout<<"将第"<<n<<"个盘面从"<<A<<"柱搬到"<<C<<"柱上"<<endl;
hanio(n-1,B,A,C);
}
}

#include<iostream>
using namespace std;
void move(char a,char c);
void hanno(int n,char a,char b,char c);
int main()
{int m;
cout<<"enter the number: ";
cin>>m;
hanno(m,'A','B','C');
system("pause");
return 0;
}
void move(char a,char c)
{cout<<a<<"->"<<c<<endl;
}
void hanno(int n,char a,char b,char c)
{if(n==1)
move(a,c);
else
{hanno(n-1,a,c,b);
move(a,c);
hanno(n-1,b,a,c);
}

分式:2^n-1
10个盘子:2^10-1=1023
至于为什么,这个东西说起来比较麻烦,而且很长。


(10分)(聪明人进)汉诺塔问题除了证明解出来的人比较聪明外,还有什么作 ...
而且你叫错人了,你不该叫聪明人进,应该叫富有想像力的人进!

说谎者悖论和汉诺塔游戏的内容介绍
它们是一切智力题的基础,唯有解开它们,你才能真正进入聪明人的行列。挑战赛现在开始!为什么稍稍转动小圈,十三个中国武士就神秘的变成了十二个?谁若是完成了汉诺塔游戏,世界将在一声霹雳中毁灭——这个印度古老的传说为何是真实的?莫比乌斯环、魔鬼图形到底是什么?中国的洛书幻方为何与占星术密切相关?来...

(聪明人进),汉诺塔问题:有10个盘子,需要移动多少步,为什么
void main(){ char A='A',B='B',C='C';int n=10;hanio(n,A,B,C);} void hanio(int n,char A,char B,char C){ if(n==1){ cout<<"将第"<<n<<"个盘面从"<<A<<"柱搬到"<<C<<"柱上"<<endl;} else { hanio(n-1,A,C,B);cout<<"将第"<<n<<"个盘面从"<<A...

如何判断一个人智力的高低?
首先,看身体运动度和协调能力大幅度的动作,能令人的肢体和大脑得到更精密的配合!其次呢,看精细的动作,据说人类智商越高越能完成各种精细的动作,也就是说一个人能一心二用,说明他的智商越高!最后一点看人的适应能力是否从小在父母的影响之下,养成了良好的习惯!还要观察他的语言能力和表达能力,...

印台区17787131716: 有没有人可以告诉我汉诺塔问题碟子与移动最少次数的关系式?以及证明?
播承当归: 假如说有一个盘子的话,只需挪动一步;假如说有n个盘子要挪An步,那么有n+1个盘子可以先通过An步把上面的n个盘子挪到第三个柱子上,再挪最大的盘子,最后把n个盘子挪到大的上面,共2An+1步,所以A(n+1)=2An+1这样计算下来An=2^n-1(2的n次方减1),如果你觉得我的建议还不错,麻烦你能够点击一下“有用”这个选项,无需你任何事物,只是你在对我的回答作为一种肯定和鼓励,谢谢~~

印台区17787131716: 脑筋急转弯,IQ高的人进 -
播承当归: 1.地狱和天堂(只有这里嘛) 2.自己的年龄嘛(简单~~) 3.走私军火 4.钱编号不一样 5.吹牛皮 6.选美 7.30根,一人10 8.活着 9.简单~~如果是诚实国的公民,会指诚实国的方向,如果是谎言国的公民,也会指诚实国的方向. 10.大勇没有数他自己 11.高兴死了 12.星星 13.打瞌睡 14.鬼才要 15.独木桥 16.脑袋 17.偷东西 18.推到明天做 19.年龄 20.天书

印台区17787131716: 口袋妖怪叶绿所有金手指代码 -
播承当归: hp: 0202423c:03e7(上限)hp: 0202423a:03e7攻击: 0202423e:03e7防御: 02024240:03e7特攻: 02024242:03e7特防: 02024244:03e7敏捷: 02024246:03e7第1宠第一招的PP:02023B68:63野生保护区无...

印台区17787131716: 问大家一个智力题 聪明人进 -
播承当归: 原来也作出了几个特殊的答案,网上也有,但是后来发现答案很多.仔细考虑了一下,此问题还是很复杂,主要考虑以下几点: 1、左、右相对问题.在相对论中左、右是相对的,如果两个人面对面站着你的左边就是我的右边; 2、首尾方面需...

印台区17787131716: 最近网上很火的一道IQ题:电梯最多能乘坐10人,你正好是第10个,走进电梯后却超重了,你只好走出电梯,电梯门关上后,你想到了一件恐怖的事情,立即报警. 请问,怎么回事? 提示1:当时是夏天,电梯里9人有男有女,没有孕妇,没有胖子,没有宠物.提示2:电梯顶部没有尸体.提示3:没有人 -
播承当归: 网上很火的一道IQ题:电梯最多能乘坐10人,你正好是第10个,走进电梯后却超重了,你只好走出电梯,电梯门关上后,你想到了一件恐怖的事情,立即报警. 请问,怎么回事? 提示1:当时是夏天,电梯里9人有男有女,没有孕妇,没有胖子...

印台区17787131716: 自己感觉自己聪明的人进来! -
播承当归: (1) ①他们每人出10元 ②找回5元 ③25元他们有 2个人出8元 1个人出9元 8+8+9=25元 ④服务生还给他们3元 即是:9+9+10=28元 ⑤服务生偷了2元. ⑥三人的28元加上服务生偷的2元 28+2=30元.(2) ①葱白7毛0.7元 、 葱绿3毛 0.3元② 50x0....

印台区17787131716: 聪明的进来! -
播承当归: 这让我想到了一个以前玩的一个拿棋子的游戏,这题可以想成3堆的,即3个不同的数为一组,假定通过某种特殊的运算,可以得到一个定值,那么我们所要做的,就是找出满足条件的这样的所有组合,然后再排列. 不妨设15个人为1-15, 设...

印台区17787131716: 问关于智商的问题,真正聪明人进 -
播承当归: 智商并不是天生的,而是靠后天逐步培养出来的.简单来说,人的智商可以体现在几个方面:一、模仿能力(学习);二、适应能力(接受);三、应用能力(思考);四、想象能力(创造). 每一个小孩出生的时候大脑的时候没有思维能力,...

印台区17787131716: 聪明的人进来 -
播承当归: 别被搞混了!帮你理清思路:我们可以把这几个人分为两个部分,出钱方和收钱方 出钱方是三个学生,一人90,共270元 收钱方是店老板和店小二,他们分别获得的钱是250元和20元 所以,这个钱数的进出时等额的,根本没有变化.而你那样的算法放了一个错误就是,原来学生每人交了100元,后来每人找了10元,所以他们实际每人只交了90元,学生的账目时没问题的.而总共出钱是270元,但你却把收钱方之一的店小二的20元钱和270元相加,很明显,这样的出的结果根本没有一个明确的意思.而如果你用270-20=250,得到的将是收钱另一方店老板所得到的钱250元.明白了吗 ?

印台区17787131716: 聪明的人先好进入 白痴就免了__高级推理题
播承当归: 我算出来了答案就是10个人背后是死 如果一个人背后是死的话,那么他第一天就会自杀,因为他看到的所有人背后都是生 如果2个人背后是死的话,那么他第2天才会自杀,因为他不确定自己是否背后也是死,如果自己背后是生的话,另一个背后是死的人就会在第一天自杀,所以要2天后2个人才死 同理得出最后有10个人背后是死

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网