中国的黑科技上市公司:C语言汉诺塔(高分提问)

来源:百度文库 编辑:中科新闻网 时间:2024/04/26 17:08:17
#include <stdio.h>
void hanio(int n,char a,char b,char c)
{
void move(char x,char y);
if(n==1)
move(a,c);
else
{
hanio(n-1,a,c,b);(提问:为什么参数设置为a,c,b)
move(a,c);
hanio(n-1,b,a,c); (提问:而这个又设置成为b,a,c)
}
}
void move(char x,char y)
{
printf("%c---->%c\n",x,y);
}
void main()
{
clrscr();
hanio(3,'A','B','C');
}

最好是能多给点注释,谢谢

hanio(n-1,a,c,b);(提问:为什么参数设置为a,c,b)
move(a,c);
hanio(n-1,b,a,c); (提问:而这个又设置成为b,a,c)

其实如果清楚了移动规则,这个就很简单了.
分析有两个盘子的情况,显然为:
a-b
a-c
b-c
假设有n个盘子,我们也可以看作两个盘子,其中最上面的一个为x,下面的n-1个为y,那么这两个盘子的以后就和上面一样
x:a-b
y:a-c
x:b-c
而那n-1个盘子也可以用同样方法处理.这样我们像有了一个公式:
if(n==1)
直接将一个盘子从a移动到c;
else
{
先将n-1个盘子从a移动到b;
把第n个盘子从a移动到c;
将n-1个盘子从b移动到c;
}
这样就完成了移动,如果明白了这个,那么前面的就好懂了,
hanio(n-1,a,c,b); //因为hanio函数实际移动的是char a,char c,也就是第二和第四个参数,所以这儿可以看成把n-1个盘子从a移动到b;
move(a,c);
hanio(n-1,b,a,c); //这儿可以看成把n-1个盘子从a移动到b;

其实汉诺塔就是递归问题,你理解了递归思想,自然就很容易懂,这种问题一般都作为编程语言教程的递归例子讲解的,你其实可以仔细看看课本的.
hanio(n-1,a,c,b);// 这语句的意思是:首先将a 上面的n-1个盘通过c 移动到b ,这样的结果是,a 只剩下最大一块盘,然后直接移动到c就行了,所以也就有move(a,c); 之后a 为空,b 有刚才移动的n-1个盘,c 上面已经有个最大的了,如果把剩下的n-1移动到c ,就完成了,所以接着有下面的语句:
hanio(n-1,b,a,c); //这意思说,把b 上的n-1个盘通过a 移动到c,
就这样完成递归,一次次执行下去,就行了.

你的程序是模拟汉诺塔的操作过程,将每一步的执行方法打印出来;
主程序采用递归方式;认真看了下面的思想,你会明白的:
hanio(n-1,a,c,b);(提问:为什么参数设置为a,c,b)
move(a,c);
hanio(n-1,b,a,c); (提问:而这个又设置成为b,a,c)

约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下、由小到大顺序串着由64个圆盘构成的塔。目的是将最左边杆上的盘全部移到右边的杆上,条件是一次只能移动一个盘,且不允许大盘放在小盘的上面。
*问题分析与算法设计
这是一个著名的问题,几乎所有的教材上都有这个问题。由于条件是一次只能移动一个盘,且不允许大盘放在小盘上面,所以64个盘的移动次数是:
18,446,744,073,709,551,615
这是一个天文数字,若每一微秒可能计算(并不输出)一次移动,那么也需要几乎一百万年。我们仅能找出问题的解决方法并解决较小N值时的汉诺塔,但很难用计算机解决64层的汉诺塔。
分析问题,找出移动盘子的正确算法。
首先考虑a杆下面的盘子而非杆上最上面的盘子,于是任务变成了:
*将上面的63个盘子移到b杆上;
*将a杆上剩下的盘子移到c杆上;
*将b杆上的全部盘子移到c杆上。
将这个过程继续下去,就是要先完成移动63个盘子、62个盘子、61个盘子....的工作。
为了更清楚地描述算法,可以定义一个函数movedisc(n,a,b,c)。该函数的功能是:将N个盘子从A杆上借助C杆移动到B杆上。这样移动N个盘子的工作就可以按照以下过程进行:
1) movedisc(n-1,a,c,b);
2) 将一个盘子从a移动到b上;
3) movedisc(n-1,c,b,a);
重复以上过程,直到将全部的盘子移动到位时为止。