- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
梵塔问题实验报告
实验目的
熟悉和掌握问题规约法的原理、实质和规约过程
理解规约图的表示方法
熟悉并掌握递归解决问题的思想
实验原理
利用问题规约法的原理进行问题的分析与描述
利用递归思想进行问题的解决
实验条件
Window NT/xp/7及以上的操作系统
内存在512M以上
CPU在奔腾II以上
实验内容
梵塔问题源于印度古老的一个传说。相传开天辟地的神勃拉玛创造世界时在印度北部的佛教圣地的圣庙里,安放了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。值班僧侣按照法则日夜不停地搬运,当搬运完成时世界将在一声霹雳中毁灭。
实验分析
我们假设把该任务交给一个僧人,为了方便叙述,将他编号为64。僧人自然会这样想:假如有另外一个僧人能有办法将63个盘子从一个座移到另一个座,那么问题就解决了,此时僧人64只需这样做:
命令僧人63将63个盘子从A座移到C座
自己将最底下的最大的一个盘子从A座移到C座
再命令僧人63将63个盘子从B座移到C座
为了解决将63个盘子从A座移到B座的问题,僧人63又想:如果能再有一个僧人62能将62个盘子移动到另一座,我就能将63个盘子从A座移动到B座。他是这样做的:
命令僧人62将62个盘子从A移动到C
自己将一个盘子从A座移动到B座
再命令僧人62将62个盘子移到B座
再进行一次递归。如此“层层下放”,直到后来找到第2个僧人,让他完成将2个盘子从一个座移到另一个座,进行到此,问题就解决了。最后找到第1个僧人,让他完成将一个盘子从一个座移动到另一个座,至此,全部工作已经完成,该烦他问题得到解决。
实验步骤
主程序流程图
梵塔求解流程图
程序代码
#include stdio.h
#include graphics.h
#include time.h
#include dos.h
#include math.h
#define PAOGAO 190 /*动画抛高,数值越小越高*/
#define PANHOU 10
/*#define PANAMOUNT 19盘子数*/
int PANAMOUNT;
typedef int pans;
typedef struct s_pillar
{
int amount;
int x,y;
pans pan[20]; /*存放每个盘的代号*/
}pillars;
pillars pillar[4]; /*三个台柱*/
int movecount=0; /*移动计数*/
void drawpillar(pillars p);
void init(); /*初始化函数*/
void drawmat(char *mat,int matsize,int x,int y,int color); /* 点陈汉字 */
void drawpan(pans p,int x,int y);
void zimu(); /*显示字幕*/
void drawpps(); /*画装盘的台柱*/
void hanoi(); /*主算法*/
void hanoi(int n,char one,char two,char three);
void sdelay(int delay_t); /*函数申明*/
void finish(); /*完成!*/
void main(void) /*主函数*/
{
printf(\n\tplease input n(n=19): );/*输入要演示的盘子数*/
scanf(%d,PANAMOUNT);
if(PANAMOUNT1||PANAMOUNT19) /*越界的话n当19处理*/
PANAMOUNT=19 ;
init();
drawpps();
hanoi(PANAMOUNT,a,b,c);
finish();
}
void init() /* 初始化函数 */
{
int gd=DETECT,gm ;
int i,n,color ;
clrscr();
initgraph(gd,gm,c:\\tc);
cleardevice();
pillar[1].amount = PANAMOUNT;
pillar[1].x = 105;
pillar[1].y = 405;
for(i=1;i=pillar[1].amount;i++)
{
pillar[1].
文档评论(0)