回 帖 发 新 帖 刷新版面

主题:求解:汉诺塔问题

Hanoi(汉诺)塔问题。这是一个古典的数学问题:古代有一个梵塔,塔内有3个座A,B,C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图所示)。有一个老和尚想把这64个盘子从A座移到C座,但每次只允许移动一个盘子,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求编程序打印出移动的步骤。

回复列表 (共7个回复)

沙发


用JAVA实现。

public class HanoiTest {

 

    public static int number = 1;//步骤计数器
 
    public static void hanoi(int n,String a,String b,String c){
        if(n==1)

        {
            move(a,c);//如果n为1,直接把它从a移动到c代表的柱子即可。
        }else

        {
          hanoi(n-1,a,c,b);//先通过hanoi方法将最上面的(n-1)个移动到b代表的柱子上。
          move(a,c);//然后把a代表的柱子上的最后的一块移动到c代表的柱子上。
          hanoi(n-1,b,a,c);

          //最后,通过hanoi方法将最b代表的柱子上面的(n-1)个移动到c代表的柱子上。
        }
    }

    public static void main(String[] args) {
        int n = Integer.parseInt(args[0]);//n通过参数指定即可。
        HanoiTest h1 = new HanoiTest();
        h1.hanoi(n, "柱A", "柱B", "柱C");//定义a、b、c所代表的柱子的显示名称。
    }
 
    public static void move(String from,String to){
        System.out.println("第" + number + "步: "  + from + "-->" + to);

        //输出移动的动作。
        number++;
    }
}

板凳

C语言:
#include<stdio.h>
void move(char x,char y)
{
    printf("%c-->%c\n",x,y);
}
int hanoi(int n,char one,char two,char three)   /*move n diskers from one to three*/
{   static int count=0;           /*static int count the steps*/
    if(n==1)
    {move(one,three);
    count++;}
    else
    {
        hanoi(n-1,one,three,two);
        move(one,three);
        hanoi(n-1,two,one,three);
        count++;
    }
    return count;
}
main()
{
    int m,n;
    printf("Input the number of diskers:");
    scanf("%d",&m);
    printf("The step to moving %3d diskers:\n",m);
    n=hanoi(m,'A','B','C');
    printf("There must be %4d steps.\n",n);
}

3 楼

C++版
#include<iostream>
using namespace std;
int main()
{
  void hanoi(int n,char a,char b,char c);
  int n;
  cout<<"please input number of disks:"<<endl;
  cin>>n;
  hanoi(n,'a','b','c');
  return 0;
}
void hanoi(int n,char a,char b,char c)
{
  void move(char x,char y);
  if(n==1)
    move(a,c);
  else
  {
    hanoi(n-1,a,c,b);
    move(a,c);
    hanoi(n-1,b,a,c);
  }
}
void move(char x,char y)
{
  cout<<x<<"-->"<<y<<endl;
}

4 楼

java  C C++,挺全嘛~~~

5 楼

再来个汇编语言版吧

6 楼


c语言实现:
#include<stdio.h>
void move(char x,int n,char y)
{
    printf("%d:%c->%c\n",n,x,y);
    return ;
}

void hanio(int n,char x,char y,char z)
{
    if(n==1)
    move(x,1,z);
    
    else
    {
        hanio(n-1,x,z,y);
        move(x,n,z);
        hanio(n-1,y,x,z);
    }
    
    return;
}

main()
{
    int n;
    char x;
    char y;
    char z;
    x='a';
    y='b';
    z='c';
    printf("please input n:");
    scanf("%d",&n);
    hanio(n,x,y,z);
    return 0;
}

7 楼

总感觉2楼那个
static int count=0;
用的不够好
因为下次调用这个count就不对了
但是用全局变量好象更不好
不知道有没有更好的写法

我来回复

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