人工智能梵塔问题Word文件下载.docx
- 文档编号:22964365
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:19
- 大小:74.18KB
人工智能梵塔问题Word文件下载.docx
《人工智能梵塔问题Word文件下载.docx》由会员分享,可在线阅读,更多相关《人工智能梵塔问题Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
再进行一次递归。
如此“层层下放”,直到后来找到第2个僧人,让他完成将2个盘子从一个座移到另一个座,进行到此,问题就解决了。
最后找到第1个僧人,让他完成将一个盘子从一个座移动到另一个座,至此,全部工作已经完成,该烦他问题得到解决。
实验步骤
1主程序流程图
2梵塔求解流程图
程序代码
#include<
stdio.h>
graphics.h>
time.h>
dos.h>
math.h>
#definePAOGAO190/*动画抛高,数值越小越高*/
#definePANHOU10
/*#definePANAMOUNT19盘子数*/
intPANAMOUNT;
typedefintpans;
typedefstructs_pillar
{
intamount;
intx,y;
panspan[20];
/*存放每个盘的代号*/
}pillars;
pillarspillar[4];
/*三个台柱*/
intmovecount=0;
/*移动计数*/
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(n<
=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"
/*画框*/
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);
/*黄金线*/
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-20),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;
j<
matsize;
j++)
for(i=0;
n;
for(k=0;
k<
8;
k++)
if(mat[j*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);
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;
=3;
p=pillar[i];
x=p.x;
y=p.y;
mount=p.amount;
drawpillar(p);
/*画台柱*/
for(j=1;
j<
=mount;
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);
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]='
\0'
;
b[0]=y;
b[1]='
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);
/*涂黑_重画*/
bar(3,pillar[1].y-PANHOU*19-20,584,412);
/*重画*/
action(data,pillar[ifrom],pillar[ito]);
/*此处添加动画函数*/
pillar[ito].amount++;
/*入栈*/
/*刷新数量*/
pillar[ito].pan[mountt]=data;
voidclearprocess()
inti;
=16;
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((clock()-start_time)<
delay_t);
/*循环空语句*/
voidaction(panspan,pillarsfromp,pillarstop)/*移动动画*/
floatx1,y1,x2,y2;
floatp,q,a;
intx,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);
}else
a=(x1+x2)/2.0;
p=(y2-PAOGAO)/(x2-a)/(x2-a);
/*除以平方*/
if(x1<
=x2)
for(x=floor(x1+0.5);
x<
floor(x2+0.5);
x=x+7)
if(kbhit())exit();
/*用户按ESC则退出*/
y=floor((p*(x-a)*(x-a)+PAOGAO)+0.5);
drawpan(pan,x,y);
clearpan(pan,x,y);
/*清除轨迹*/
x>
x=x-7)
y=floor((p*(x-a)*(x-a)+PAOGAO)+0.5);
voidfinish()/*完成!
getch();
closegraph();
程序运行效果图
个人实验小结
通过本次实验,我学会了熟悉并掌握问题规约法的原理、实质和规约过程,理解了规约图的表示方法,熟悉并掌握递归解决问题的思想。
使我的软件编程思维能力得到了很大的提升,使我的自身能力有了长足的进步。
WelcomeTo
Download!
!
欢迎您的下载,资料仅供参考!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 人工智能 问题