Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2306638
  • 博文数量: 395
  • 博客积分: 10994
  • 博客等级: 上将
  • 技术积分: 5586
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-17 19:49
文章存档

2014年(1)

2013年(10)

2012年(74)

2011年(303)

2010年(7)

分类: 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 结束 

过程大致就是这样。

阅读(1684) | 评论(4) | 转发(0) |
给主人留下些什么吧!~~

zboom2011-05-30 18:16:27

计算机古人太牛了,膜拜膜拜。。

gududesiling2011-05-21 08:06:13

呵呵,说的也是,不过这种递归的算法,还是应该好好理解的,

cfanlds2011-05-20 22:23:39

背了,有什么意义。

cfanlds2011-05-20 22:23:37

背了,有什么意义。