回 帖 发 新 帖 刷新版面

主题:汉诺塔

给我讲讲汉诺塔,详细一些,会加分的

回复列表 (共6个回复)

沙发

汉诺塔是不记得是古埃及还是古印度还是其他古国的一个古老的故事。
在××圣地有三根银针,在第一根针放着64个盘子,从上到下按从小到大排列。
××圣人说:按××××规则(规则大家都知道吧?)移动这些盘子,使全部盘子都移到了第二根针。当完成任务时,天空就会变得漆黑一团,然后,一个大雷从天上劈了下来,整个世界就这样灭亡了……

板凳

如果要编程序,可用递归实现。

3 楼

递归吧,设初始时盘都在第一根针,第二根针可以暂存盘子,要把盘子全移到第三根针,每次递归的思想简单地说,就是把第一根针上最下面的盘子除外的所有盘子都移到第二根针,再把第一根针上的那个盘子移到第三根针,最后再把刚才移到第二根针的盘子全移到第三根针上就可以了。而把第一根针上最下面的盘子除外的所有盘子都移到第二根针,又可以先把要移的盘子中最下面的盘子除外的所有盘子都移到第三根针,再移第一根针那个盘子到第二根针,最后把刚才移到第三根针的盘子全移到第二根针上……就这样递归下去就行了。

4 楼

如果只是求移动步数的话:

如果有n个圆盘

移动步数为h=2^n-1

5 楼

下面是我用C++编的一个程序A,B,C代表三个柱子
n代表柱子A上的盘子数
//hanoi塔问题
#include <iostream.h>

void hanoi(int,char,char,char);
void main()
{
    int n;
char a='A';
char b='B';
char c='C';
cout<<"Input n:";
cin>>n;
hanoi(n,a,b,c);

}
void hanoi(int n,char a,char b,char c)
{
    if(n==1) cout<<a<<"-"<<n<<"->"<<c<<endl;
else
{
    hanoi(n-1,a,c,b);
cout<<a<<"-"<<n<<"->"<<c<<endl;
hanoi(n-1,b,a,c);
}
}

6 楼

用Pascal实现为:
procedure hanoi(a,b,c,n:integer);    {借助b把a上n个盘转移到c上}
  begin
    if n=1 then wirte(a,'-->',c)
      else { hanoi(a,c,b,n-1)          {先把a上n-1个盘转移到b上}
             write(a,'-->',c)          {把剩余的1个盘转移到c上}
             hanoi(b,a,c,n-1) }        {把b上n-1个盘转移到c上}
  end
*这里的a,b,c并不一定就是1,2,3在程序运行中会改变,读入和主程序比较简单,就不写了 ^_^

我来回复

您尚未登录,请登录后再回复。点此登录或注册