汉诺塔动态演示程序 下载本文

内容发布更新时间 : 2024/5/19 1:33:07星期一 下面是文章的全部内容请认真阅读。

共享知识 分享快乐

汉诺塔递归算法C语言动态演示

汉诺塔递归算法具体演示功能: ①任意输入演示的个数;

②选择电脑自动演示和手动单步执行两种方式;

③若选择电脑自动演示请输入速度;

④屏幕上显示算法执行过程。

演示算法流程图:

汉诺塔模块编码:

汉诺塔问题是一个经典的递归问题。它给出的圆盘移动条件是:一次仅能移动一个盘,且不允许大

盘放在小盘的上面[1]。

算法演示思想[10]:设要解决的的汉诺塔共有N个圆盘,对A杆上的全部N个圆盘从小到大顺序编号,

最小的圆盘为1号,次之为2号,依次类推,则最下面的圆盘的编号为N。

卑微如蝼蚁、坚强似大象

共享知识 分享快乐

第一步:先将问题简化。假设A杆上只有一个圆盘,即汉诺塔只有一层N

A杆上移到B杆上即可。

第二步:对於一个有N(N>1)个圆盘的汉诺塔,将N个圆盘分成两部分:上面的N-1个圆盘

和最下面的N号圆盘。

第三步:将“上面的N-1个圆盘”看成一个整体,为了解决N个圆盘的汉诺塔,可以按下面图示的

方式迳行操作:

1、将A杆上面的N-1个盘子,借助B杆,移到C杆上;

1,则只要将1号盘从

2、 将A杆上剩余的N号盘子移到B杆上;

3、 将C杆上的N-1个盘子,借助A杆,移到B杆上。

按照上面的想法,我们要演示的就是具体的移盘操作。

关键技术:画盘子 、移盘、显示移盘步骤

实现步骤: 1、画盘子;

2、移盘、显示移盘步骤。

卑微如蝼蚁、坚强似大象

共享知识 分享快乐

核心代码实现如下: n 画盘子 首先定义一下盘子的结构:

struct H

{

int data[15];/*存放每个盘的代号*/ int top;/*每个塔的具体高度*/

}num[3];/*三个塔*/

接下来要定义一些标志变量来判断运行方式,比如: int computer=1;/*自动控制与手动控制的标志*/ int speed=0;/*全局变量speed主要是演示过程的速度*/

然后要处理输入数据越界的情况,因为盘子个数过多,将很难实现,因此这里以0

界的话n当10处理。代码如下:

… if(n<1||n>10)

n=10;/*越界的话n当10处理*/

下面来开始画盘子:

首先初始化三个地方塔的高度,代码如下:

for(i=0;i<3;i++)

num[i].top=-1;/*三个地方的高度开始都为-1*/

然后画一开始的塔座A上的盘子,代码如下:

for(i=0;i

{

卑微如蝼蚁、坚强似大象