人工智能(梵塔问题)

上传人:Sc****h 文档编号:122113315 上传时间:2022-07-20 格式:DOC 页数:14 大小:322KB
收藏 版权申诉 举报 下载
人工智能(梵塔问题)_第1页
第1页 / 共14页
人工智能(梵塔问题)_第2页
第2页 / 共14页
人工智能(梵塔问题)_第3页
第3页 / 共14页
资源描述:

《人工智能(梵塔问题)》由会员分享,可在线阅读,更多相关《人工智能(梵塔问题)(14页珍藏版)》请在装配图网上搜索。

1、.梵塔问题实验报告实验目的1. 熟悉和掌握问题规约法的原理、实质和规约过程2. 理解规约图的表示方法3. 熟悉并掌握递归解决问题的思想实验原理1. 利用问题规约法的原理进行问题的分析与描述2. 利用递归思想进行问题的解决实验条件1. Window NT/xp/7 及以上的操作系统2. 内存在 512M 以上3. CPU在奔腾 II 以上实验内容梵塔问题源于印度古老的一个传说。相传开天辟地的神勃拉玛创造世界时在印度北部的佛教圣地的圣庙里,安放了三根金刚石的棒,第一根上面套着 64 个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,

2、规定可利用中间的一根棒作为帮助,但每次只能搬一个, 而且大的不能放在小的上面。 值班僧侣按照法则日夜不停地搬运,当搬运完成时世界将在一声霹雳中毁灭。实验分析我们假设把该任务交给一个僧人, 为了方便叙述, 将他编号为 64。僧人自然会这样想:假如有另外一个僧人能有办法将 63 个盘子从一个座移到另一个座,那么问题就解决了,此时僧人64 只需这样做:1. 命令僧人 63 将 63 个盘子从 A 座移到 C 座2. 自己将最底下的最大的一个盘子从 A 座移到 C 座3. 再命令僧人 63 将 63 个盘子从 B 座移到 C 座为了解决将 63 个盘子从 A 座移到 B 座的问题,僧人 63 又想:如

3、果能再有一个僧人 62 能将 62 个盘子移动到另一座, 我就能将 63 个盘子从 A 座移动到 B 座。他是这样做的:1. 命令僧人 62 将 62 个盘子从 A 移动到 C2. 自己将一个盘子从 A 座移动到 B 座3. 再命令僧人 62 将 62 个盘子移到 B 座1/13.再进行一次递归。如此“层层下放” ,直到后来找到第2 个僧人,让他完成将 2 个盘子从一个座移到另一个座,进行到此,问题就解决了。最后找到第1个僧人,让他完成将一个盘子从一个座移动到另一个座, 至此,全部工作已经完成,该烦他问题得到解决。实验步骤 主程序流程图开始 梵塔求解流程图输入盘子数开始初始化过程盘子数为n绘制

4、初始图形是否n 为 1?汉诺塔求解将盘子从A 座移到 C 座递归调用,初始n=n-1结束退出一级调用n=n+1主程序流程图结束梵塔问题递归过程流程图程序代码#include #include #include #include #include #define PAOGAO 190/* 动画抛高,数值越小越高*/#define PANHOU 10/*#define PANAMOUNT 19 盘子数 */int PANAMOUNT;typedef int pans;typedef struct s_pillar2/13.int amount;int x,y;pans pan20;/* 存放每个盘

5、的代号*/pillars;pillars pillar4;/* 三个台柱 */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

6、n,char one,char two,char three);void sdelay(int delay_t); /* 函数申明 */void finish();/* 完成! */void main(void)/* 主函数 */printf(ntplease input n(n=19): );/* 输入要演示的盘子数 */ scanf(%d,&PANAMOUNT);if(PANAMOUNT19) /* 越界的话 n 当 19 处理 */ PANAMOUNT=19 ;init();drawpps();hanoi(PANAMOUNT,a,b,c);finish();void init()/*初始

7、化函数*/int gd=DETECT,gm ;int i,n,color ;clrscr();initgraph(&gd,&gm,c:tc);cleardevice();pillar1.amount = PANAMOUNT;pillar1.x = 105;pillar1.y = 405;for(i=1;i=pillar1.amount;i+)pillar1.pani=pillar1.amount-i+1;pillar2.amount = 0;pillar2.x = 320;pillar2.y = 405;3/13.pillar3.amount = 0;pillar3.x = 527;pilla

8、r3.y = 405;setcolor(YELLOW);/* 柱座标记 */settextstyle(0,0,2);outtextxy(105,418,A);outtextxy(320,418,B);outtextxy(527,418,C);setcolor(YELLOW);/* 画框 */setlinestyle(SOLID_LINE,0,NORM_WIDTH);line(0,0,0,479);line(0,0,639,0);line(639,0,639,479);line(0,479,639,479);line(0,PAOGAO-PANHOU-40,450,PAOGAO-PANHOU-40

9、); /* 黄金线 */settextstyle(0,0,1);outtextxy(250,PAOGAO-PANHOU-50,Press ANY Key to EXIT !); /* 线上字 */ zimu();void drawpillar(pillars p)/* 画柱 */int x,y,mount;x=p.x;y=p.y;mount=p.amount;setfillstyle(SOLID_FILL,BROWN);bar(x,(y-mount*PANHOU-20),x+5,y);bar(x-45,y,x+55,y+5);void drawmat(char *mat,int matsize

10、,int x,int y,int color)/* 依次:字模指针、点阵大小、起始坐标(x,y)、颜色 */int i,j,k,n;n=(matsize-1)/ 8+1;for(j=0;jmatsize;j+)for(i=0;in;i+)for(k=0;kk)/* 测试为 1 的位则显示 */putpixel(x+i*8+k,y+j,color);void drawpan(pans p,int x,int y)setfillstyle(SOLID_FILL,LIGHTGRAY);bar(x-(5+5*p),y-PANHOU+1,x+(5+5*p),y);setlinestyle(SOLID_L

11、INE,0,NORM_WIDTH);4/13.setcolor(BLACK);line(x-(5+5*p),y,x+(5+5*p),y);line(x-(5+5*p),y+1,x+(5+5*p),y+1);void clearpan(pans p,int x,int y)setfillstyle(SOLID_FILL,BLACK);bar(x-(5+5*p),y-PANHOU,x+(5+5*p),y);void drawpps()/* 画装盘的台柱*/pillars p;int i,j;int x,y,mount;for(i=1;i=3;i+)p = pillari;x = p.x;y = p

12、.y;mount = p.amount;drawpillar(p);/* 画台柱 */for(j=1; j=15) clearprocess();/*清除步骤提示 */movecount = movecount%15+1; /* 模 20+1*/setcolor(RED);/* 输出移动过程 */settextstyle(TRIPLEX_FONT, HORIZ_DIR, 1);outtextxy(560,30+movecount*10,a);outtextxy(580,30+movecount*10,-);outtextxy(620,30+movecount*10,b);setfillstyl

13、e(SOLID_FILL,BLACK);/*涂黑 _重画 */bar(3,pillar1.y-PANHOU*19-20,584,412);drawpps();/* 重画 */action(data,pillarifrom,pillarito);/*此处添加动画函数*/pillarito.amount+;/* 入栈 */mountt = pillarito.amount;/*刷新数量 */pillarito.panmountt = data;drawpps();/* 重画 */void clearprocess()int i;setfillstyle(SOLID_FILL,BLACK);for(

14、i=0;i=16;i+)bar(545,30+i*10,638,40+i*10);sdelay(1);/* 动画延迟n 个 (1/18.2) 秒 */整数 1 代表 (1/18.2) 秒 */void sdelay(int delay_t)6/13.clock_t start_time ;start_time=clock();while(clock()-start_time)delay_t) ; /*循环空语句 */void action(pans pan,pillars fromp,pillars top)/* 移动动画 */float x1,y1,x2,y2;float p,q,a;int

15、 x,y,temp;/* 整形变量用与当前帧*/x1 = (float)(fromp.x);y1 = (float)(fromp.y - fromp.amount*PANHOU -20);/*PANHOU 为盘厚常数 ,减 20 处理,以便避开柱子*/x2 = (float)(top.x);y2 = (float)(top.y - top.amount*PANHOU);q = -sqrt(y1-PAOGAO)/(y2-PAOGAO); /*此处注意产生增根*/if(1-q)/* 除数不为 0*/a = (x1 - x2*q)/(1-q);elsea = (x1+x2)/2.0;p = (y2-

16、PAOGAO)/(x2-a)/(x2-a);/* 除以平方 */if(x1 = x2)for(x=floor(x1+0.5); xfloor(x2+0.5); x=x- 7 )if(kbhit() exit(); /* 用户按 ESC则退出 */y = floor(p*(x-a)*(x-a)+PAOGAO)+0.5);drawpan(pan,x,y);sdelay(1);clearpan(pan,x,y);/* 清除轨迹 */void finish()/* 完成! */7/13.getch();closegraph();程序运行效果图8/13.9/13.10/13.11/13.个人实验小结12/13.通过本次实验,我学会了 熟悉并掌握问题规约法的原理、实质和规约过程,理解了规约图的表示方法, 熟悉并掌握递归解决问题的思想。 使我的软件编程思维能力得到了很大的提升,使我的自身能力有了长足的进步。13/13

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!