voip
风的方向
厚德致远,博学敦行!
posts - 52,comments - 21,trackbacks - 0
         我们不断做着把事情翻译成语言的工作!
         汉诺塔老生常谈的问题!
         个人体会:一、理解函数意义和数据意义!
                             二、想象力,就像把一棵二叉树先展开,再收拢!
         直接上代码(注释以前写的):
#include<stdio.h>
int count1,count;//count1,表示第一个圆盘移动的次数
                 
//count,表示总的移动次数

/*函数功能:限制移动过程
  函数参数: 整形变量num,表示第n个盘子
           自发性变量 from,表示源木桩
           字符型变量to,表示目的木桩
           
*/


void move(int num,char from,char to)
{
    printf(
"move %d:from %c to %c\n",num,from,to);
    count
++;
}


/*函数功能:将第n个盘子从源木桩A,借助于木桩C移动到木桩B
函数参数:n,表示第n个盘子
          a,表示源木桩a
          b,表示目的木桩b
          c,表示过度木桩c
*/


/*我自己想法:
       三个木桩,从第n个盘开始移动,只有当其他的盘都在c木桩才能移动n,
       同理要将第n-1个盘从c移动到b,要将n-2个盘全部移动到a木桩
*/




void hanoi(int n,char a,char b,char c)
{
    
if(n==1)                         //递归出口:为什么是n==1?
    {                                
        move(n,a,b);                 
//第n个盘子由a->b
        count1++;
    }

    
else
    
{
        hanoi(n
-1,a,c,b);            //将第n-1个盘子,借助于b由a->c   
        move(n,a,b);                 //第n个盘子有a->b
        hanoi(n-1,c,b,a);            //将第n-1个盘子,借助于a有c->b
    }

}



int main()
{
        
int  n;
        
while(n!=0)
        
{
             scanf(
"%d",&n);
            hanoi(n,
'A','B','C');
            printf(
"count=%d\n",count);
            printf(
"count1=%d\n",count1);
        }

        
return 0;
}



/*通过程序运行,我们还可以得到:
            当n为偶数时,第一个盘第一次移动移动到c,
            当n为奇数时,第一个盘第一次移动到移动到b
*/

运行结果:
posted on 2010-09-07 21:56 jince 阅读(212) 评论(0)  编辑 收藏 引用 所属分类: 算法设计与分析

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


哈哈哈哈哈哈