1、 /* 船运行一个来回后河左岸的野人、传教士的人数 */ int ssr,spr; /* 回来(由左向右时)船上的人数 */ int sst,spt; /* 去时(由右向左时)船上的人数 */ int loop; /* 本结点所在的层数 */ struct SPQ *upnode ,*nextnode;/* 本结点的父结点和同层的下一个结点的地址 */spq;int loopnum;/* 记录总的扩展次数 */int openednum;/* 记录已扩展节点个数 */int unopenednum;/* 记录待扩展节点个数 */int resultnum;struct SPQ *opened;
2、struct SPQ *oend;struct SPQ *unopened;struct SPQ *uend;struct SPQ *result;void initiate();void releasemem();void showresult();void addtoopened(struct SPQ *ntx);int search();void goon();int stretch(struct SPQ* ntx);void recorder();int main() int flag; /* 标记扩展是否成功 */ for( ; ; ) initiate(); flag = sear
3、ch (); if(flag = 1) recorder(); releasemem(); showresult(); goon(); else printf(无法找到符合条件的解); system(pause return 0;void initiate() int x; char choice; uend = unopened = (struct SPQ*)malloc(sizeof(spq); if(uend=NULL)n内存不够!n exit(0); unopenednum=1; openednum=0; unopened - upnode = unopened; /* 保存父结点的地
4、址以成链表 */ 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值皆为3n for(;)n是否修改?(Y/N) scanf(%s,&choice); choice=toupper(choice); if(choice=Y n请输入传教士人数%dx); if(x
5、0) pr = x; break; else printf(n输入值应大于0!n请重新输入n请输入野人人数0) sr = x; N)break;int search() struct SPQ *ntx; /* 提供将要扩展的结点的指针 */ ntx = unopened; /* 从待扩展链表中提取最前面的一个 */ if(ntx-loop = maxloop) addtoopened(ntx); /* 将ntx加入已扩展链表,并将这个节点从待扩展链表中去掉 */ flag = stretch(ntx); /* 对ntx进行扩展,返回-1,0,1 */ return 1;int stretch(
6、struct SPQ *ntx) int fsr , fpr ; /* 在右岸上的人数 */ int fsl , fpl ; /* 在左岸上的人数 */ int sst , spt ; /* 出发时在船上的人数 */ int ssr , spr ; /* 返回时船上的人数 */ struct SPQ *newnode; for (sst = 0 ; sst sr; fpr = ntx - pr; fsl = ntx - sl; fpl = ntx - pl; if (sst = fsr) & ( 2 - sst) upnode = ntx; nextnode = NULL; sr = 0; p
7、r = 0; sl = opened - pl = opened - sst = sst; spt = spt; loop = ntx - loop + 1; oend - nextnode = newnode; oend = newnode; openednum+; else if (fpr - fsr) * fpr = 0) /* 判断是否满足传教士人数必须大于或等于野人人数 */ fsl = fsl + sst; fpl = fpl + spt; for (ssr = 0 ; ssr = 1 ; ssr+) /* 返回 */ int ffsl , ffpl; if (ssr = fsl)
8、 & (1 - ssr) = 0) /* 若符合条件则分配内存并付值 */ int ffsr , ffpr; ffsr = fsr + ssr; ffpr = fpr + spr; sr = ffsr; pr = ffpr; sl = ffsl; pl = ffpl; ssr = ssr; spr = spr; uend - uend = newnode; unopenednum+;void addtoopened(struct SPQ *ntx) unopened = unopened - nextnode; unopenednum-; if (openednum = 0 ) oend =
9、opened = ntx; nextnode = ntx; oend = ntx;void recorder() int i , loop; loop = oend - loop; ntx = oend; resultnum = 0; for( i = 0 ; i pr = ntx - sl = ntx - pl = ntx - sst = ntx - sst; spt = ntx - spt; ssr = ntx - ssr; spr = ntx - spr; ntx = ntx - upnode; if(i = 0) result = newnode; nextnode = result;
10、 resultnum+;void releasemem() int i; struct SPQ* nodefree; for ( i = 1 ; openednum ; nodefree = opened; opened = opened - free(nodefree); for ( i = 0 ; unopenednum ; nodefree = unopened;void showresult()%d个传教士,result - pr);%d个野人 sr); pl); sl); resultnum ; nodefree = result; result = result -nnt左岸人数
11、船上人数及方向 右岸人数n第%d轮n,i); fpl = result - pl - result - spt + result - fpr = result - pr - result - fsl = result - sl - result - sst + result - fsr = result - sr - result -传教士%8d%8dt spt,fpr);野 人%8d%8dt sst,fsr);传教士%8d%8dt-t%8dn pl,result - spr,result - spr);野 人%8d%8dt- sl,result - ssr,result - ssr);n全体传教士和野人全部到达对岸 free(result);void goon()是否继续?(Y/N)n scanf ( , &)exit(0); 四实验心得 这次试验让我熟悉了环境,加深了对算法的理解,掌握了把基本算法编程机器语言的能力。更加深入了解了什么是人工智能,让我了解了人工智能的作用以及含义和人工智能的使用范围以及对于我们未来生活得作用的广大。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1