人工智能梵塔问题.docx
《人工智能梵塔问题.docx》由会员分享,可在线阅读,更多相关《人工智能梵塔问题.docx(11页珍藏版)》请在冰豆网上搜索。
![人工智能梵塔问题.docx](https://file1.bdocx.com/fileroot1/2022-10/20/09f4ed5a-01cc-464d-97a8-a6628035e81f/09f4ed5a-01cc-464d-97a8-a6628035e81f1.gif)
人工智能梵塔问题
梵塔问题实验报告
实验目的
1.熟悉和掌握问题规约法的原理、实质和规约过程
2.理解规约图的表示方法
3.熟悉并掌握递归解决问题的思想
实验原理
1.利用问题规约法的原理进行问题的分析与描述
2.利用递归思想进行问题的解决
实验条件
1.WindowNT/xp/7及以上的操作系统
2.内存在512M以上
3.CPU在奔腾II以上
实验内容
梵塔问题源于印度古老的一个传说。
相传开天辟地的神勃拉玛创造世界时在
印度北部的佛教圣地的圣庙里,安放了三根金刚石的棒,第一根上面套着64个
圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮
助,但每次只能搬一个,而且大的不能放在小的上面。
值班僧侣按照法则日夜不停地搬运,当搬运完成时世界将在一声霹雳中毁灭。
实验分析
1.命令僧人62将62个盘子从A移动到C
2.自己将一个盘子从A座移动到B座
3.再命令僧人62将62个盘子移到B座
再进行一次递归。
如此“层层下放”,直到后来找到第2个僧人,让他完成将2个盘子从一个座移到另一个座,进行到此,问题就解决了。
最后找到第1个僧人,让他完成将一个盘子从一个座移动到另一个座,至此,全部工作已经完成,该烦他问题得到解决。
实验步骤
⑴主程序流程图
初始化过程
盘子数为n
结束
退出一级调用n=n+1
丁程
结束
梵塔问题递归过程流程图
程序代码
#include
#inelude
#inelude
#inelude
#inelude
#definePAOGAO190/*动画抛高,数值越小越高*/
#definePANHOU10
/*#definePANAMOUNT19盘子数*/
intPANAMOUNT;
typedefintpans;
typedefstructs_pillar
{
intamount;
intx,y;
panspan[20];/*存放每个盘的代号*/
}pillars;
pillarspillar[4];/*三个台柱*/
intmovecount=O;/*移动计数*/
voiddrawpillar(pillarsp);
voidinit();/*初始化函数*/
voiddrawmat(char*mat,intmatsize,intx,inty,intcolor);/*点陈汉字*/voiddrawpan(pansp,intx,inty);
voidzimu();/*显示字幕*/
voiddrawpps();/*画装盘的台柱*/
voidhanoi();/*主算法*/
voidhanoi(intn,charone,chartwo,charthree);
voidsdelay(intdelay_t);/*函数申明*/
voidfinish();/*完成!
*/
voidmain(void)/*主函数*/
{
printf("\n\tpleaseinputn(*=19):
");/*输入要演示的盘子数*/
scanf("%d",&PANAMOUNT);
if(PANAMOUNT<1||PANAMOUNT>19)/*越界的话n当19处理*/PANAMOUNT=19;
init();
drawpps();
hanoi(PANAMOUNT,'a','b','c');
finish();
}
voidinit()/*初始化函数*/
{
intgd=DETECT,gm;
inti,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].pan[i]=pillar[1].amount-i+1;
}
pillar[2].amount=0;
pillar[2].x=320;
pillar[2].y=405;
pillar[3].amount=0;
pillar[3].x=527;
pillar[3].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,O,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);/*黄金线*/settextstyle(0,0,1);
outtextxy(250,PAOGAO-PANHOU-50,"PressANYKeytoEXIT!
");zimu();
}
voiddrawpillar(pillarsp)/*画柱*/
{
intx,y,mount;
x=p.x;
y=p.y;
mount=p.amount;
setfillstyle(SOLID_FILL,BROWN);
bar(x,(y-mount*PANHOU-2O),x+5,y);
bar(x-45,y,x+55,y+5);
}
voiddrawmat(char*mat,intmatsize,intx,inty,intcolor)
/*依次:
字模指针、点阵大小、起始坐标(x,y)、颜色*/
{inti,j,k,n;
n=(matsize-1)/8+1;
for(j=0;jfor(i=0;ifor(k=0;k<8;k++)
if(mat『n+i]&(0x80»k))/*测试为1的位则显示*/
putpixel(x+i*8+k,y+j,color);
}
voiddrawpan(pansp,intx,inty)
{
setfillstyle(SOLID_FILL,LIGHTGRAY);
bar(x-(5+5*p),y-PANHOU+1,x+(5+5*p),y);
setlinestyle(SOLID_LINE,O,NORM_WIDTH);
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);
}
voidclearpan(pansp,intx,inty)
{
setfillstyle(SOLID_FILL,BLACK);
bar(x-(5+5*p),y-PANHOU,x+(5+5*p),y);
}
voiddrawpps()/*画装盘的台柱*/
{
pillarsp;
inti,j;
intx,y,mount;
for(i=1;i<=3;i++)
{
p=pillar[i];
x=p.x;
y=p.y;
mount=p.amount;
drawpillar(p);/*画台柱*/
for(j=1;j<=mount;j++)
{
drawpan(p.pan[j],x,y-PANHOU*(j-1));
}
}
}
voidhanoi(intn,charone,chartwo,charthree)
{
voidmove(charx,chary);/*声明*/
if(n==1)
{
move(one,three);
}
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
voidmove(charx,chary)
{
voidclearprocess();/*申明函数*/
voidaction();/*申明移动动画函数*/
intifrom,ito;
pansdata;
intmountf,mountt;
chara[1];
charb[1];
a[0]=x;a[1]='\O:
b[O]=y;b[1]='\O:
ifrom=x-96;
ito=y-96;
mountf=pillar[ifrom].amount;/*数量*/
mountt=pillar[ito].amount;
data=pillar[ifrom].pan[mountf];
pillar[ifrom].amount--;/*出栈*/
sdelay(6);/*暂停屏幕*/
if(movecount>=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);
setfillstyle(SOLID_FILL,BLACK);/*涂黑_重画*/bar(3,pillar[1].y-PANHOU*19-20,584,412);
drawpps();/*重画*/
action(data,pillar[ifrom],pillar[ito]);/*此处添加动画函数*/
pillar[ito].amount++;/*入栈*/
mountt=pillar[ito].amount;/*刷新数量*/
pillar[ito].pan[mountt]=data;
drawpps();/*重画*/
}
voidclearprocess()
{
inti;
setfillstyle(SOLID_FILL,BLACK);
for(i=0;i<=16;i++)
{
bar(545,30+i*10,638,40+i*10);
sdelay
(1);/*动画延迟n个(1/18.2)秒*/
}
}
整数1代表(1/18.2)秒*/
voidsdelay(intdelay_t)
{
clock_tstart_time;
start_time=clock();
while((