汉诺塔的算法 5
算法介绍:当盘子的个数为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亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。
参考资料来源:百度百科-汉诺塔
把三根柱子按顺序排成“品”字型,把所有圆盘按从大到小的顺序放于柱子A上,根据圆盘数量来确定柱子排放的顺序:n若为偶数的话,顺时针方向依次摆放为:ABC;而n若为奇数的话,就按顺时针方向依次摆放为:ACB。
这样经过反复多次的测试,最后就可以按照规定完成汉诺塔的移动。因此很简单的,结果就是按照移动规则向一个方向移动金片:如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C。
福利手游APP(下载搜0.1)
手游充值0.1折
¥免费分享
手游代理加盟限时特惠!
推广手游拿分成
¥79元
手游加盟代理自助注册页面
入行手游项目必看教程
¥198
新自由之刃(百人同屏)
满攻速魂环版传奇
¥1.76复古
绝世仙王之八荒寻仙录
超高人气仙侠手游
¥无折扣返利
自由之刃2(新)
冰龙魂环复古经典
¥新版复古传奇
查
看
更
多
- 官方电话
- 在线客服
-
官方服务
- 官方网站
- 福利app
- 代理申请
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;
}
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');
}
#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;
}