人工智能二野人过河问题实验3Word文档格式.docx
《人工智能二野人过河问题实验3Word文档格式.docx》由会员分享,可在线阅读,更多相关《人工智能二野人过河问题实验3Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
stdio.h>
stdlib.h>
ctype.h>
#definemaxloop100/*最大层数,对于不同的扩展方法自动调整取值*/
#definepristnum3/*初始化时设定有3个野人3个传教士,实际可以改动*/
#defineslavenum3
structSPQ{intsr,pr;
/*船运行一个来回后河右岸的野人、传教士的人数*/
intsl,pl;
/*船运行一个来回后河左岸的野人、传教士的人数*/
intssr,spr;
/*回来(由左向右时)船上的人数*/
intsst,spt;
/*去时(由右向左时)船上的人数*/
intloop;
/*本结点所在的层数*/
structSPQ*upnode,*nextnode;
/*本结点的父结点和同层的下一个结点的地址*/
}spq;
intloopnum;
/*记录总的扩展次数*/
intopenednum;
/*记录已扩展节点个数*/
intunopenednum;
/*记录待扩展节点个数*/
intresultnum;
structSPQ*opened;
structSPQ*oend;
structSPQ*unopened;
structSPQ*uend;
structSPQ*result;
voidinitiate();
voidreleasemem();
voidshowresult();
voidaddtoopened(structSPQ*ntx);
intsearch();
voidgoon();
intstretch(structSPQ*ntx);
voidrecorder();
intmain()
{
intflag;
/*标记扩展是否成功*/
for(;
;
)
{
initiate();
flag=search();
if(flag==1)
recorder();
releasemem();
showresult();
goon();
}
else
printf("
无法找到符合条件的解"
);
system("
pause"
return0;
}
voidinitiate()
intx;
charchoice;
uend=unopened=(structSPQ*)malloc(sizeof(spq));
if(uend==NULL)
\n内存不够!
\n"
exit(0);
unopenednum=1;
openednum=0;
unopened->
upnode=unopened;
/*保存父结点的地址以成链表*/
nextnode=unopened;
sr=slavenum;
pr=pristnum;
sl=0;
pl=0;
sst=0;
spt=0;
ssr=0;
spr=0;
loop=0;
设有n个传教士和m个野人来到河边,打算乘一只船从右岸到左岸去。
该船的负载能力为两人。
在任何时候,如果野人人数超过传教士人数,野人\n"
就会把传教士吃掉。
\n默认的n、m值皆为3\n"
for(;
;
)
\n是否修改?
(Y/N)"
scanf("
%s"
&
choice);
choice=toupper(choice);
if(choice=='
Y'
{
\n请输入传教士人数"
%d"
x);
if(x>
0)
pr=x;
break;
elseprintf("
\n输入值应大于0!
\n请重新输入"
\n请输入野人人数"
0)
sr=x;
}
N'
)break;
intsearch()
structSPQ*ntx;
/*提供将要扩展的结点的指针*/
ntx=unopened;
/*从待扩展链表中提取最前面的一个*/
if(ntx->
loop==maxloop)
addtoopened(ntx);
/*将ntx加入已扩展链表,并将这个节点从待扩展链表中去掉*/
flag=stretch(ntx);
/*对ntx进行扩展,返回-1,0,1*/
return1;
intstretch(structSPQ*ntx)
intfsr,fpr;
/*在右岸上的人数*/
intfsl,fpl;
/*在左岸上的人数*/
intsst,spt;
/*出发时在船上的人数*/
intssr,spr;
/*返回时船上的人数*/
structSPQ*newnode;
for(sst=0;
sst<
=2;
sst++)/*讨论不同的可能性并判断是否符合条件*/
fsr=ntx->
sr;
fpr=ntx->
pr;
fsl=ntx->
sl;
fpl=ntx->
pl;
if((sst<
=fsr)&
&
((2-sst)<
=fpr))/*满足人数限制*/
spt=2-sst;
fsr=fsr-sst;
fpr=fpr-spt;
if((fpr==0)&
(fsr==0))/*搜索成功*/
newnode=(structSPQ*)malloc(sizeof(spq));
if(newnode==NULL)
newnode->
upnode=ntx;
nextnode=NULL;
sr=0;
pr=0;
sl=opened->
pl=opened->
sst=sst;
spt=spt;
loop=ntx->
loop+1;
oend->
nextnode=newnode;
oend=newnode;
openednum++;
elseif((fpr-fsr)*fpr>
=0)/*判断是否满足传教士人数必须大于或等于野人人数*/
fsl=fsl+sst;
fpl=fpl+spt;
for(ssr=0;
ssr<
=1;
ssr++)/*返回*/
intffsl,ffpl;
if((ssr<
=fsl)&
((1-ssr)<
=fpl))
spr=1-ssr;
ffsl=fsl-ssr;
ffpl=fpl-spr;
if((ffpl-ffsl)*ffpl>
=0)
{/*若符合条件则分配内存并付值*/
intffsr,ffpr;
ffsr=fsr+ssr;
ffpr=fpr+spr;
sr=ffsr;
pr=ffpr;
sl=ffsl;
pl=ffpl;
ssr=ssr;
spr=spr;
uend->
uend=newnode;
unopenednum++;
voidaddtoopened(structSPQ*ntx)
unopened=unopened->
nextnode;
unopenednum--;
if(openednum==0)
oend=opened=ntx;
nextnode=ntx;
oend=ntx;
voidrecorde