我们不断做着把事情翻译成语言的工作!
汉诺塔老生常谈的问题!
个人体会:一、理解函数意义和数据意义!
二、想象力,就像把一棵二叉树先展开,再收拢!
直接上代码(注释以前写的):
#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 阅读(220)
评论(0) 编辑 收藏 引用 所属分类:
算法设计与分析