全部博文(395)
分类: C/C++
2011-05-18 19:55:16
注:汉诺塔问题是笔试常考题,也许你会感觉,会不会汉诺塔对你编程并没有太大的帮助,可是在笔试的部分,一般都会出这道题,没办法,只能好好理解了,如果真是理解不了的话,那就把代码记下来,这个代码真是比较经典,注意:记不住背下来,很多程序员都是先学会背程序的,呵呵
#include"stdio.h"
int number=0;
void main()
{
void hanoi(int n,char one,char two,char three) ;
int m;
printf("input the number of diskes:");
scanf("%d",&m);
printf("the step to moving %3d diskes:\n",m);
hanoi(m,'A','B','C');
printf("%d\n",number);
}
void hanoi(int n,char one,char two,char three)
{
void move(char x,char y) ;
if(n==1)
move(one,three);
else
{
hanoi(n-1,one,three,two); //将上面n-1个盘子从a座借助c座移到b座
move(one,three); //将最后那个盘子从a移到c
hanoi(n-1,two,one,three); //再将b上那n-1个盘子从b借助a移到c
}
}
void move(char x,char y)
{
printf("%c-->%c\n",x,y);
number++;
}
目的:把n个东西从A处移动到C处。
分析:
如果只有一个:直接搬过去即可: if(n==1) printf("%c---%c\n",a,c);
否则,把除最下面的那个以外的先放到b处: hanoi(n-1,a,c,b );
再把最下面的那个搬到c处;
于是问题就变成了:把n-1个东西从b处移动到c处: hanoi(n-1,b,a,c);
递归就开始了……
n-1,n-2,……,2,1 结束
过程大致就是这样。