汉诺塔的算法 5

 我来答
赋予你我的眼
高粉答主

2019-06-26 · 赋予你我的眼专注游戏解说
赋予你我的眼
采纳数:71 获赞数:41606

向TA提问 私信TA
展开全部

算法介绍:当盘子的个数为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亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。

参考资料来源:百度百科-汉诺塔

风林网络手游平台
2022-07-16 · 百度认证:四川风林网络科技有限公司官方账号
风林网络手游平台
向TA提问
展开全部
汉诺塔算法介绍:
把三根柱子按顺序排成“品”字型,把所有圆盘按从大到小的顺序放于柱子A上,根据圆盘数量来确定柱子排放的顺序:n若为偶数的话,顺时针方向依次摆放为:ABC;而n若为奇数的话,就按顺时针方向依次摆放为:ACB。
这样经过反复多次的测试,最后就可以按照规定完成汉诺塔的移动。因此很简单的,结果就是按照移动规则向一个方向移动金片:如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C。
  • 官方电话
  • 在线客服
  • 官方服务
    • 官方网站
    • 福利app
    • 代理申请
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友af60faf09
2007-01-30 · TA获得超过1636个赞
知道大有可为答主
回答量:774
采纳率:0%
帮助的人:920万
展开全部
#include<iostream.h>

void move(char ch1, char ch2) {
cout<<ch1<<"->"<<ch2<<' ';
}

void hanoi(int n, char a, char b, char c) {
if (n==1)
move (a,c);
else {
hanoi (n-1,a,c,b);
move (a,c);
hanoi (n-1,b,a,c);
}
}

void main() {
int m;
cout<<"Enter the number of disk to move:\n";
cin>>m;
cout<<"The step to moving "<<m<<" disk:\n";
hanoi (m,'A','B','C');
cin>>m;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
笪波悉瀚彭
2019-12-10 · TA获得超过3478个赞
知道大有可为答主
回答量:3062
采纳率:26%
帮助的人:172万
展开全部
#include<stdio.h>
  
void
hanoi(int
n,char
A,char
B,char
C)
  
{
  
if(n==1)
  
{
  printf("Move
disk
%d
from
%c
to
%c\n",n,A,C);
  }
  
else
  
{
  hanoi(n-1,A,C,B);
  
printf("Move
disk
%d
from
%c
to
%c\n",n,A,C);
  
hanoi(n-1,B,A,C);
  
}
  
}
  
main()
  
{
  int
n;
  
printf("请输入数字n以解决n阶汉诺塔问题:\n");
  
scanf("%d",&n);
  
hanoi(n,'A','B','C');
    
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
郁宜似滢滢
2020-07-05 · TA获得超过3772个赞
知道大有可为答主
回答量:3054
采纳率:26%
帮助的人:208万
展开全部
用递归实现:
#include
<iostream.h>
void
towers(int
n,
char
frompeg,
char
auxpeg,
char
topeg)
{
if
(1
==
n)
//递归出口
{
cout
<<
"move
disk
1
from
peg
"
<<
frompeg
<<
"
to
peg
"
<<
topeg
<<
endl;
return;
}
//把n-1个盘子从frompeg借助topeg移动到auxpeg
towers(n
-
1,
frompeg,
topeg,
auxpeg);
//把盘子n由frompeg直接移动到topeg
cout
<<
"move
disk
"
<<
n
<<
"
from
peg
"
<<
frompeg
<<
"
to
peg
"
<<
topeg
<<
endl;
//把n-1个盘子从auxpeg借助frompeg移动到topeg
towers(n
-
1,
auxpeg,
frompeg,
topeg);
}
int
main()
{
int
n
=
0;
cout
<<
"pleae
input
disk
number:";
cin
>>
n;
towers(n,
'a',
'b',
'c');
return
0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(7)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式