资源描述:
《汉诺塔动态演示程序.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、汉诺塔递归算法C语言动态演示 汉诺塔递归算法具体演示功能: ①任意输入演示的个数; ②选择电脑自动演示和手动单步执行两种方式; ③若选择电脑自动演示请输入速度; ④屏幕上显示算法执行过程。演示算法流程图:汉诺塔模块编码: 汉诺塔问题是一个经典的递归问题。它给出的圆盘移动条件是:一次仅能移动一个盘,且不允许大盘放在小盘的上面[1]。算法演示思想[10]:设要解决的的汉诺塔共有N个圆盘,对A杆上的全部N个圆盘从小到大顺序编号,最小的圆盘为1号,次之为2号,依次类推,则最下面的圆盘的编号为N。第一步:先将问
2、题简化。假设A杆上只有一个圆盘,即汉诺塔只有一层N1,则只要将1号盘从A杆上移到B杆上即可。 第二步:对於一个有N(N>1)个圆盘的汉诺塔,将N个圆盘分成两部分:上面的N-1个圆盘和最下面的N号圆盘。 第三步:将“上面的N-1个圆盘”看成一个整体,为了解决N个圆盘的汉诺塔,可以按下面图示的方式迳行操作:1、将A杆上面的N-1个盘子,借助B杆,移到C杆上; 2、将A杆上剩余的N号盘子移到B杆上; 3、 将C杆上的N-1个盘子,借助A杆,移到B杆上。 按照上面的想法,我们要演示的就是具体的移盘操作。关键技术:画盘子、
3、移盘、显示移盘步骤实现步骤:1、画盘子; 2、移盘、显示移盘步骤。核心代码实现如下:n 画盘子首先定义一下盘子的结构:structH{ intdata[15];/*存放每个盘的代号*/ inttop;/*每个塔的具体高度*/}num[3];/*三个塔*/ 接下来要定义一些标志变量来判断运行方式,比如:intcomputer=1;/*自动控制与手动控制的标志*/intspeed=0;/*全局变量speed主要是演示过程的速度*/然后要处理输入数据越界的情况,因为盘子个数过多,将很难实现,因此这里以
4、05、
6、n>10) n=10;/*越界的话n当10处理*/… 下面来开始画盘子:首先初始化三个地方塔的高度,代码如下:… for(i=0;i<3;i++) num[i].top=-1;/*三个地方的高度开始都为-1*/ …然后画一开始的塔座A上的盘子,代码如下:…for(i=0;i7、um[0].top]=i;/*最大的盘子代号为0,依次为1,2,…n-1*/ color=num[0].data[num[0].top]+1;/*盘子的颜色代码为栈顶盘子代号加1*/ setfillstyle(SOLID_FILL,color); bar(100-(33-3*num[0].data[num[0].top]),400-20*i-8,100+(33-3*num[0].data[num[0].top]),400-20*i+8);/*画矩形*/ } se
8、tcolor(YELLOW); outtextxy(180,450,"anykeytocontinue"); settextstyle(0,0,2); outtextxy(90,420,"A");/*塔座标志*/ outtextxy(240,420,"B"); outtextxy(390,420,"C"); …n 移盘、显示移盘步骤接下来要做的解决移盘问题并显示移盘步骤,这个过程的代码如下:…inti; charnum1[3],num2[3];
9、 sprintf(num1,"%c",x-32);/*将小写变成大写,并转换成字符串输出*/ sprintf(num2,"%c",y-32); setfillstyle(SOLID_FILL,BLACK);/*把原来的地方移去涂黑*/ bar(0,0,640,60); setcolor(RED); outtextxy(150,30,num1);/*输出移动过程*/ outtextxy(200,30,"--->"); outtextxy(310,30,num2); set
10、textstyle(0,0,2); setfillstyle(SOLID_FILL,BLACK);/*把原来的地方移去涂黑*/ bar(100+150*(x-97)-(33-3*num[x-97].data[num[x-97].top]),400-20*num[x-97].top-8,100+150*(x-97)+(33-3*num