hanoi游戏攻略目录
28 汉诺塔(Hanoi)问题一个典型的(?????)问-|||-题-|||-A.查找-|||-B
什么叫做 Tower of Hanoi???!!!(一个数学游戏)
Hanoi游戏,也被称为hanota游戏,是一种经典的益智游戏。把一组盘子从一根柱子移动到另一根柱子,但每次只能移动一个盘子,不能把大盘子放在小盘子上。
以下是Hanoi游戏的攻略。
1.决定最少的步数:河内?游戏的最小步数是2^n?是1。n是盘子的数量。因此,首先要明确所需的最少步数。
2.制定移动战略:移动盘子时,要遵守以下规则。
一次只能移动一个盘子。
正确的排列顺序是,大盘子在下面,小盘子在上面。
-一次只能从最上面的盘子移动。
3.通过递归解决:Hanoi博弈可以通过递归解决。具体步骤如下。
- n-1个盘子从起始柱移动到辅助柱;
-将最大的盘子从起始柱移动到目标柱;
- n ?1 .把盘子从辅助柱移动到目标柱。
4.按照上述策略移动:按照移动策略和递归程序,依次移动盘子,直到游戏完成。
通过以上的攻略,应该可以让河内游戏取得成功。冷静地找到最优解,巧妙地利用空间移动盘子,这一点不能忘记。
这是一个递归的问题。
相传在古印度的圣庙中,有一种被称为河内(Hanoi)的游戏。
在这个游戏中,铜板上有三根棍子(A、B、C),棍子从下往上,从大到小依次放有64个金盘子。
游戏的目标是把A上的金盘全部移到C上,并按原来的顺序摞起来。
操作规则:一次只能移动一个盘子。而且在移动期间,在三根杆上始终保持大盘向下,小盘向上。在操作过程中,盘子可以放在A、B、C中的任何一个控制杆上。
分析:对于这个问题,谁都不可能把移动盘子的所有步骤都写下来,但是可以用下面的方法来解决。
移动的盘子数为n。为了将n个盘子从控制杆A移动到控制杆C,需要进行以下三个步骤。
(1)以杆C为中介,从杆A从1号到n?把1号移到B杆上;
(2)把A中剩下的n号移到C中。
(3)中介A;从杆B开始1 ~ n?将1号移到控制杆C上。
这样问题就解决了,但实际上只完成了步骤2,步骤1和步骤3会成为移动的新问题。
这个工作的本质是将移动n个盘子的问题改为n?移动一页纸,那么第1、3步是如何解决的呢?实际上,上述方法可以将盘子的数量设为n, n是任意的数量。这个方法是n?移动一个盘子的场合也适用。
因此,通过上述方法,n?解决一个盘子从杆A到杆B(步骤1)或从杆B到杆C(步骤3)的问题。
那么问题来了,从移动n个盘子的操作到n?移动两个盘子。
根据这个原理,通过将原问题层层递归,移动n-2、n-3……是3,2,到移动1个盘的操作,到移动1个盘的操作原封不动可能。
这样我们的任务就真正完成了。
像这样用简单的问题和已知的运算来解决复杂问题的方法就是递归法。
在计算机的设计语言中,用递归法写的程序就是递归程序。
include &腺苷酸;是lt;iostream&。是gt;

using namespace std;
void hanoi(int n,char a,char b,char c)。
void printf(char开始,char ending);
int main。
{
int m, n;。
char Aa='A',Bb='B',Cc='C';
cout&。是lt;&。有位;\\\"。Enter a number:\\\";
辛&是gt;&。是gt;是m;
hanoi(m、Aa、Bb、Cc)。
辛&是gt;&。是gt;是n;
return 0;
}
void printf(char starting,char ending)。
{
cout&。是lt;&。是lt;starting &腺苷酸;是lt;&。有位;\\\"。——&腺苷酸;gt;是\\\" &。是lt;&。是lt;end &腺苷酸;是lt;&。是lt;是endl;
}
void hanoi(int n,char a,char b,char c)。
{
if (n &腺苷酸;是lt;=1)
printf(a,c)。
埃尔塞。
{
hanoi (n ?1,a,c,b)。
printf(a,c)。
hanoi (n ?1、b、a、c)。
}
}
它是用DEV c++写的。
哈诺塔问题(hannota问题)是根据一个传说而产生的问题。
有三根棍子A、B、C。
A杆上有N个(n>1)将光盘穿孔,从下往上减小光盘的大小。
按照以下规则将所有圆盘移动到C条上。
1,每次只能移动一个圆盘;
2,大盘子不能叠放在小盘子上。
提示:你可以把圆盘暂时放在B棒上,也可以把从A棒取出的圆盘重新放回A棒上。
问:如何移动?最少要移动几次?
最早发明这个问题的是法国数学家爱德华?我是卢卡斯。
有这样一个传说。在印度的一座寺院里,有64个金盘连着三根柱子。
寺院的僧侣遵循古老的预言,按照上述规则移动盘子。预言这个盘子移动完的话,世界就会灭亡。
这个传说被称为梵天塔问题(Tower of Brahma puzzle)。
不知道是卢卡斯创造的传说,还是受到启发的传说。
如果传说属实,僧侣们完成这个任务需要264 > 1步;如果他们能每秒移动一个盘子,那么就需要5846亿年。
宇宙只有137亿年。
关于这个传说,有寺院变成修道院,僧侣变成修士等几种变化。
关于地点众说纷纭,有一种说法是在越南河内。
此外,还有“金盘是创世时制作的”、“僧侣们每天移动一盘”等背景设定。
佛教中确实有“浮屠”(塔)这样的建筑;有的领导会遵守上述规则。
“河内塔”的名字被认为是从中南半岛在殖民地时代传到欧洲的。
解法。
很多河内塔的玩具都有8个盘子(disks)。
初学者不可能有答案,但算法非常简单。
任何初始结构的解决方法。
从任何初始结构中寻求最优解的算法,其一般化如下。
用Scheme语言来表示。
;Let conf be a list of the postions of the disks in order of increasing size。
;Let the pegs be identified by the numbers 0, 1 and 2。
define (hanoi conf t)。
(c (list->vector conf)))
(define (move h f t))
(矢量组合!c, h, t。
(printf"move disk ~s from peg ~s to peg ~s~n"h f t)。
(define (third-peg f t) (- 3f t))
(define (hanoi h t))
(if (& gt;h 0。)
let (h (sub1 h))
(let (f (vector) c h))。
(if (not (= f t))。
let (r (third-peg f t))。
(hanoi h r)
(move h f t))
(hanoi h t)))))
(hanoi (vector-length c) t))。
C语言是这样的。
int conf [height];Element conf[d] gives the current position of disk d. */
void move(int d, int t){
/* move disk d to peg t */
conf[d] = t。
}
void hanoi(int h, int t){
if (h>0)。
int f = conf[h?1]。
if(是f != t){
int r = 3 - f - t;
hanoi(h-1, r)。
move(h-1, t)。
}
hanoi(h-1, t)。
}
}
In PASCAL:
procedure Hanoi(n: integer;from, to, by:是char);
Begin。
if (n=1) then。
writeln(>Move the plate from >, from, > to >, to)。
else begin。
Hanoi(n-1, from, by, to);
Hanoi(1, from, to, by)。
Hanoi(n-1, by, to, from)。
end;。
end;。
一般取N=64。
这种情况下,至少264?你必须移动一次。
也就是说,即使每秒移动一个圆盘,也需要5845亿5400万年。
根据现在的大爆炸理论,宇宙的年龄被推测为137亿年。
在实际的玩具中,一般N=8。你需要移动255次。
N=10时,移动1023次。
N=15时,移动32767次。也就是说,从3岁到99岁,如果每天移动一个圆盘,就只能移动15个。
N=20时,需要移动1048575次。必须移动100万次以上。
热门资讯
2024-04-26
2024-04-26
2024-04-26
2024-04-26
2024-04-26
2024-04-26
2024-04-26
2024-04-26
2024-04-26
2024-04-26
2024-04-26
2024-04-26
2024-04-26
2024-04-26
2024-04-26
2024-04-26
精品推荐