求解类似汉诺塔的一种算法。物品分类

作者&投稿:牛葛 (若有异议请与网页底部的电邮联系)
汉诺塔的算法~

算法介绍:当盘子的个数为n时,移动的次数应等于2^n–1。后来一位美国学者发现一种出人意料的简单方法,只要轮流进行两步操作就可以了。首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子A上,根据圆盘的数量确定柱子的排放顺序:若n为偶数,按顺时针方向依次摆放A、B、C;
若n为奇数,按顺时针方向依次摆放A、C、B。
所以结果非常简单,就是按照移动规则向一个方向移动金片:如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C
汉诺塔问题也是程序设计中的经典递归问题。

扩展资料
由来:
法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。
不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。
不管这个传说的可信度有多大,如果考虑一下把64片金片,由一根针上移到另一根针上,并且始终保持上小下大的顺序。这需要多少次移动呢?这里需要递归的方法。假设有n片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不难证明f(n)=2^n-1。n=64时,
假如每秒钟一次,共需多长时间呢?一个平年365天有31536000 秒,闰年366天有31622400秒,平均每年31556952秒,计算一下:18446744073709551615秒。
这表明移完这些金片需要5845.54亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845.54亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。
参考资料来源:百度百科-汉诺塔

汉诺塔
#include
int yd(char a,char b,char c,int n)
{
staticint t=0;
if (n==2)
{
printf("%c->%c
%c->%c
%c->%c
",a,c,a,b,c,b);
t=t+3;
}
else
{
yd(a,c,b,n-1);
printf("%c->%c
",a,b);
t++;
yd(c,b,a,n-1);
}
return t;
}
main()
{
int n;
scanf("%d",&n);
printf("%d",yd('a','b','c',n));
}
a.b.c是三个塔,运行后输入a塔上初始的块数。

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。

不管这个传说的可信度有多大,如果考虑一下把64片金片,由一根针上移到另一根针上,并且始终保持上小下大的顺序。这需要多少次移动呢?这里需要递归的方法。假设有n片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不难证明f(n)=2^n-1。n=64时,

假如每秒钟一次,共需多长时间呢?一个平年365天有31536000 秒,闰年366天有31622400秒,平均每年31556952秒。

计算一下:18446744073709551615秒这表明移完这些金片需要5845.54亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845.54亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等非生物,都早已经灰飞烟灭。

希望我能帮助你解疑释惑。




求解类似汉诺塔的一种算法。物品分类
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个...

如何解汉诺塔问题
1.利用二叉递归树 文献[4]指出:汉诺塔问题的递归算法代码与二叉树的中序遍历算法代码十分相似,故采用了二叉树的中序遍历,发现汉诺塔问题的算法步骤正好可以画成一棵完全二叉树,其中序遍历过程就是汉诺塔问题的算法步骤。函数move(N-1,s,e,t) N:盘子数 ,s:起始桩 e:目标桩 t:过渡桩...

python解决汉诺塔问题?
解汉诺塔最简单的做法就是递归:类似如何将大象装进冰箱:1)将冰箱门打开;2)把大大象放进去;3)把冰箱门关上……我们将所有的盘都在同一个杆上从大到小排列视为【完美状态】,那么,目标就是将最大盘片为n的完美状态从a杆移到b杆,套用装大象的思路,这个问题同样是三步:1)把n-1的完美状...

汉诺塔问题怎样解决?
1.将B最上面的一个盘子移到C上,就个就是上面一个盘子的情况,即A1次 2.将B最下面的盘子移到A上,一次就好。3.将C的所有盘子(1个),移到A上面,即A1次。也就是A2=2A1+1=3 =2^2-1 三个盘子,分三步:1.将B最上面的两个盘子移到C上,即A2次 2.将B最下面的盘子移到A上,一次...

C语言、、、求解、、类似汉诺塔
int i=0,j=0;int b[2][4]={8,7,6,5,4,3,2,1};scanf("%d,%d",&i,&j);if(i>=1&&i<3&&j>=1&&j<5)return b[2-i][4-j];return 0;} 基本构想是这样的 当你输入两个数(用逗号隔开)按回车就能指定第几行第几个数字第一行第一个是1按顺序排下去一直到最后一个8;...

汉诺塔问题用什么方法解决?
汉诺塔问题的求解是需要借助于递归方法来实现的。1、就是我们不管前面有多少个盘子,就是需要将A上面除了最大的盘子之外的所有n-1个盘子借助C移动到B。2、然后移动A柱子上最大的盘子到C柱子(A->C),这时候,就无需再考虑最大盘子的移动了,就是剩下的n-1个盘子,怎么把他们从B移动到C上面。3...

教你如何用二进制来解汉诺塔问题,简单好用
详情请查看视频回答

【C语言】递归详解汉诺塔问题
【C语言】探索递归艺术:破解汉诺塔之谜 在古老的印度神话里,汉诺塔是一个充满智慧与挑战的谜题。当大梵天创造世界时,他用三根金刚石柱子,顶层排列着64个黄金圆盘,遵循着严格的规则:只能每次移动一个圆盘,且小圆盘必须置于大盘子之上。这一挑战,婆罗门需如何在规定下移动圆盘,以避免世界末日的到来?

如何解汉诺塔问题
汉诺塔是一个迭代问题,我们先假设x层汉诺塔从第一根柱子移动到最后一根柱子(目标柱子)的最快次数是f(x)次 显然f(1)=1 f(2)=3 然后看3层的,我们可以把整个过程分解为三个部分 一,把第一第二层移动到中间的柱子(过渡柱子),最快f(2)步 二,把第三层移动到最后一根柱子(目标柱子),最...

汉诺塔问题用什么方法解决?
1、计划能力决定圆盘移动顺序 完成汉诺塔任务时要对圆盘的移动顺序进行预先计划和回顾性计划活动。当问题呈现后,在开始第一步的移动之前,大多数被试都会根据设定好的目标状态,对圆盘的移动顺序进行预先计划。以决定圆盘的移动顺序,但是这种计划能力的作用可能会受到问题难度的影响。2、抑制能力参与汉诺塔问题...

玉门市19117514100: 求解类似汉诺塔的一种算法.物品分类 -
魏盆盐酸: 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根...

玉门市19117514100: C语言、、、、求解、、类似汉诺塔我现在有两摞工件每一摞有4个,共
魏盆盐酸: woring(int t){int i=0,j=0;int b[2][4]={8,7,6,5,4,3,2,1};scanf("%d,%d",&i,&j);if(i>=1&&i=1&&j你不是两摞吗 怎么能输入一个数就可以呢这个就相当于 两层楼啊 每层有四个房间...

玉门市19117514100: 学习C语言 从日常生活中找出三个例子,描述它们的算法. -
魏盆盐酸: 百钱百鸡 穷举法 汉诺塔 递归法 八皇后问题 回朔法 背包问题 贪婪法

玉门市19117514100: 算法与程序框图习题 -
魏盆盐酸: 一、选择题 1、根据算法的程序框图,当输入n=6时,输出的结果是( )A.35 B.84C.49 D.252、如图,汉诺塔问题是指有3根杆子A,B,C,杆...

玉门市19117514100: 汉诺塔问题算法 -
魏盆盐酸: 用递归实现:#include void Towers(int n, char fromPeg, char auxPeg, char toPeg){ if (1 == n) //递归出口 { cout << "Move Disk 1 from Peg " <...

玉门市19117514100: 递归和迭代的区别有哪些 -
魏盆盐酸: 递归是不断的压栈.非常消耗内存.是相当于一种解决事物的算法.不断的执行相同的函数代码,类似的可以解决汉诺塔等问题.而迭代你可以理解为取出容器里东西的方法.

玉门市19117514100: 谁有递归算法? -
魏盆盐酸: 汉诺塔的递归算法:void move(char x,char y){ printf("%c-->%c\n",x,y); } void hanoi(int n,char one,char two,char three){/*将n个盘从one座借助two座,移到three座*/ if(n==1) move(one,three); else{ hanoi(n-1,one,three,two); move(one,three); hanoi(...

玉门市19117514100: 那位牛人能详细讲解一下面这个汉诺塔算法?voidmove(int
魏盆盐酸: 书上写得自己看去 就是一种归纳法,一个子的时候,直接从a放到c; 否则多个子的时候,总是要把前面n-1个子全都放在b上,然后再把最后一个子放到c上,然后再将b移过去c move(n-1,a,c,b)意思是:目的地是b,c作为中转,直到n-1个子都放到b上 然后move(n-1,b,a,c)再把a当中转,以c为目的地传 仔细理解吧

玉门市19117514100: 求汉诺塔C递归算法详细解答 -
魏盆盐酸: Hanoi塔问题, 算法分析如下,设A上有n个盘子.如果n=1,则将圆盘从A直接移动到C.如果n=2,则:(1)将A上的n-1(等于1)个圆盘移到B上;(2)再将A上的一个圆盘移到C上;(3)最后将B上的n-1(等于1)个圆盘移到C上.如果n=...

玉门市19117514100: c语言编程问题,求解.(汉诺塔) -
魏盆盐酸: 恩 昨天用 python 写的 c语言版本#include //第一个塔为初始塔,中间的塔为借用塔,最后一个塔为目标塔 int i=1;//记录步数 void move(int n,char from,char to) //将编号为n的盘子由from移动到to {printf("第%d步:将%d号盘子%c---->%c\n",i++...

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