主题:求解:汉诺塔问题
chinazhaoxy
[专家分:30] 发布于 2009-01-13 15:17:00
Hanoi(汉诺)塔问题。这是一个古典的数学问题:古代有一个梵塔,塔内有3个座A,B,C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图所示)。有一个老和尚想把这64个盘子从A座移到C座,但每次只允许移动一个盘子,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求编程序打印出移动的步骤。
回复列表 (共7个回复)
沙发
u2008 [专家分:20] 发布于 2009-01-22 22:43:00
用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++;
}
}
板凳
hhj0301 [专家分:150] 发布于 2009-01-28 11:58:00
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 楼
lee830317 [专家分:20] 发布于 2009-03-29 20:22:00
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 楼
冰河砺剑 [专家分:20] 发布于 2009-04-01 23:05:00
java C C++,挺全嘛~~~
5 楼
i_cplusplus [专家分:290] 发布于 2009-04-03 20:58:00
再来个汇编语言版吧
6 楼
gongkaitc [专家分:20] 发布于 2009-04-19 16:46:00
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 楼
小令00 [专家分:1040] 发布于 2009-04-20 23:31:00
总感觉2楼那个
static int count=0;
用的不够好
因为下次调用这个count就不对了
但是用全局变量好象更不好
不知道有没有更好的写法
我来回复