汉诺塔规则是什么

汉诺塔规则是什么,第1张

汉诺塔游戏规则:

1、有三根相邻的柱子,标号为A,B,C。

2、A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘

3、现在把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方。

汉诺塔的由来

法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。

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

Program Hanoi(input,output);

uses

crt;

type

a3=array[13] of byte;

var

n :byte;

Col,Flag:a3;

( print a disk size is n on (x,y) )

Procedure Disk(x,y,n:byte);

var

i:byte;

Begin

for i:=0 to n do

begin

gotoxy(x+i,y);write(');

gotoxy(x-i,y);write(');

gotoxy(80,25);

end;

end;

( a sound procedure when move a disk )

Procedure Sing;

var

i,freq:integer;

Begin

Randomize;

for i:=1 to 10 do

begin

freq:=Random(2900)+100;

Sound(freq); Delay(20000);

NoSound;

end;

end;

( clear a disk size is n on (x,y) )

Procedure ClrDisk(x,y,n:byte);

var

i:byte;

Begin

for i:=n downto 0 do

begin

gotoxy(x+i,y);write(' ');

gotoxy(x-i,y);write(' ');

end;

end;

( initiate procedure )

Procedure Initiate;

var

i:byte;

Begin

clrscr;

repeat { input n }

gotoxy(5,5);

write('输入汉锘塔的层数<1髇1>:');

ClrEol;read(n);

until (0<n) and (n<12);

clrscr; {version information}

gotoxy(28,1);

write(' ',n,'-Hanoi Problem ');

gotoxy(37,2);

write('199210 WYZ');

for i:=8 to 19 do {three pointers }

begin

gotoxy(15,i);write(');

gotoxy(40,i);write(');

gotoxy(65,i);write(');

end;

for i:=1 to 80 do { the bottom }

begin

gotoxy(i,20);write(');

end;

{ print A,B,C }

gotoxy(15,21);write('A');

gotoxy(40,21);write('B');

gotoxy(65,21);write('C');

for i:=n downto 1 do {n disks }

Disk(15,19-n+i,i-1);

{ initiate array Col[3],Flag[3] }

Col[1]:=15; Col[2]:=40; Col[3]:=65;

Flag[1]:=n+1; Flag[2]:=1; Flag[3]:=1;

{ some informations }

gotoxy(5,24);

write('Press spacebar to begin');

repeat until ReadKey<>'';

gotoxy(5,24);ClrEol;

gotoxy(5,24);ClrEol;

write('Press any key to break');

end;

( move a disk FROM from TO too )

Procedure Move(m,from,too:byte);

var

x1,y1,x2,y2,n,step:byte;

Begin

x1:=Col[from]; y1:=20-Flag[from]+1;

x2:=Col[too] ; y2:=20-Flag[too];

step:=too-from; n:=m-1;

repeat { up }

ClrDisk(x1,y1,n);

if y1>=8 then begin gotoxy(x1,y1);write('); end;

dec(y1);

Disk(x1,y1,n);Delay(10000);

until y1=5;

dec(Flag[from]);

repeat { shift }

ClrDisk(x1,5,n);

inc(x1,step);

Disk(x1,5,n);Delay(10000);

until x1=x2;

repeat { down }

ClrDisk(x2,y1,n);

if y1>=8 then begin gotoxy(x1,y1);write('); end;

inc(y1);

Disk(x2,y1,n);Delay(10000);

until y1=y2;

inc(Flag[too]);

( Sing; )

if KeyPressed then Halt(0);

end;

( n Hanoi Problem )

procedure N_Hanoi(n,a,b,c:byte);

Begin

if n=1 then Move(1,a,c)

else begin

N_Hanoi(n-1,a,c,b);

Move(n,a,c);

N_Hanoi(n-1,b,a,c);

end;

end;

( print end information of this program )

Procedure Final;

Begin

gotoxy(5,24);ClrEol;

write('I have moved all disks !');

gotoxy(5,25);

write('Press spacebar to end');

repeat until ReadKey<>'';

end;

Begin

Initiate;

N_Hanoi(n,1,2,3);

Final;

End

游戏里有三根金刚石柱子,在一根柱子上从下往上安大小顺序摞着64片黄金圆盘。玩家需要做的是把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

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

参考资料:

百度百科-汉诺塔游戏

这是一个递归的算法。

第一步,n-1个金片从a经c移动到b

不是“一步”完成的,而是“一个阶段”(一次递归调用)完成的。

在假定它完成的基础上,第二步就可以完成了。

在上面两步完成的基础上,第三步,n-1个金片从b经a移动到c,完成后全部工作就完成了。

========

至于“n-1个金片从a经c移动到b”是怎么完成的,这就要“老和尚给小和尚讲故事”了:

第一步,先移动n-2个金片,再移动第n-1个金片,最后把n-2个金片移动到位。

#!/bin/bash 

E_NOPARAM=10 # 错误码1:没有参数传给脚本 

E_BADPARAM=20 # 错误码2:传给脚本的盘子数不合法 

Moves=0 # 保存移动次数的全局变量

dohanoi() { # 递归函数 

    case $1 in

    0)

        ;;

    )

        dohanoi "$(($1-1))" $2 $4 $3

        echo move $2 "-->" $3

        let "Moves += 1" # 这儿修改了原脚本

        dohanoi "$(($1-1))" $4 $3 $2

        ;;

    esac

}

case $# in

1)

    case $(($1>0)) in # 至少要有一个盘子

    1)

        dohanoi $1 1 3 2

        echo "Total moves = $Moves"

        exit 0;

        ;;

    )

        echo "$0: illegal value for number of disks";

        exit $E_BADPARAM;

        ;;

    esac

    ;;

)

    echo "usage: $0 N"

    echo " Where \"N\" is the number of disks"

    exit $E_NOPARAM;

    ;;

esac

根据《高级Bash Shell脚本编程指南pdf》上的示例改写。

program hannuota;//汉诺塔游戏

var

panzi :integer;

procedure move(n,a,b,c : integer);

begin

if n = 1 then

write(a,' to ',c)

else begin

move(n-1,a,b,c);

writeln(a,' to ',c);

move(n-1,b,a,c);

end;

end;

begin

writeln('please write a number of the number of panzi');

read(panzi);

move(panzi,1,2,3);

readln;

readln;

end

以上就是关于汉诺塔规则是什么全部的内容,包括:汉诺塔规则是什么、用C语言编汉诺塔游戏要有图形、汉诺塔游戏规则等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9423788.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存