ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:59.77KB ,
资源ID:16693337      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/16693337.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(传教士与野人过河问题文档格式.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

传教士与野人过河问题文档格式.docx

1、对应右岸的传教士数为3m;左岸的食人者数为c,则有c=0,1,2,3;对应右岸食人者数为3c;左岸船数为b,故又有b=0,1;右岸的船数为1-b。(2)确定状态组,分别列出初始状态集和目标状态集。问题的状态可以用一个三元数组来描述,以左岸的状态来标记,即右岸的状态可以不必标出。 Sk=(m, c, b)初始状态只有一个:S0=(3, 3, 1),初始状态表示全部成员在河的的左岸;目标状态也只有一个:Sg=(0,0,0),表示全部成员从河的左岸全部渡河完毕。(3)定义并确定操作集。仍然以河的左岸为基点来考虑,把船从左岸划向右岸定义为Pij操作。其中,第一下标i表示船载的传教士数,第二下标j表示船

2、载的食人者数;同理,从右岸将船划回左岸称之为Qij操作,下标的定义同前。则共有10种操作,操作集为 F=P01,P10,P11,P02,P20,Q01,Q10,Q11,Q02,Q20(4)估计全部的状态空间数,并尽可能列出全部的状态空间或予以描述。在这个问题世界中,S0=3,3,1为初始状态,S31=Sg=(0,0,0)为目标状态。全部的可能状态共有32个,如表61所示。 表61 传教士和食人者问题的全部可能状态状 态m, c, b m, c, bS03,3,1S81,3,1S163,3,0S241,3,0S13,2,1S91,2,1S173,2,0S251,2,0S23,1,1S101,1,

3、1S183,1,0S261,1,0S33,0,1S111,0,1S193,0,0S271,0,0S42,3,1S120,3,1S202,3,0S280,3,0S52,2,1S130,2,1S212,2,0S290,2,0S62,1,1S140,1,1S222,1,0S300,1,0S72,0,1S150,0,1S232,0,0S310,0,0值得注意的是按照题目规定的条件,我们应该划去不合法的状态,这样可以加快搜索求解的效率。例如,首先可以划去岸边食人者数目超过传教士的情况,即4、S8、S9、S20、S24、S25等6种状态是不合法的;其次,应该划去右岸边食人者数目超过修道士的情况,即S6、S

4、7、S11、S22、S23、S27等情况;余下20种合法状态中,又有4种是不可能出现的状态;S15和S16不可能出现,因为船不可能停靠在无人的岸边;S3不可能出现,因为传教士不可能在数量占优势的食人者眼皮底下把船安全地划回来;还应该划去S28,因为传教士也不可能在数量占优势的食人者眼皮底下把船安全地划向对岸。可见,在状态空间中,真正符合题目规定条件的只有16个合理状态。(5) 当状态数量不是很大时,按问题的有序元组画出状态空间图,依照状态空间图搜索求解。 根据上述分析,共有16个合法状态和允许的操作,可以划出传教士和食人者问题的状态空间图,如图64所示。 图64 传教士和食人者问题的状态空间如

5、图64所示,由于划船操作是可逆的,所以图中状态节点间用双向箭头连接,箭头旁边所标的数字表示了或操作的下标,即分别表示船载的传教士数和食人者数。这样,任何一条从S0到达S31的路径都是该问题的解。这样,通过运用状态空间表示法就解决了传教士和食人者问题的求解。源代码:#include stdlib.hctype.h#define maxloop 100 /* 最大层数,对于不同的扩展方法自动调整取值 */ #define pristnum 3 /*初始化时设定有3个野人3个传教士,实际可以改动*/ #define slavenum 3struct SPQ int sr,pr; /* 船运行一个来回

6、后河右岸的野人、传教士的人数 */ int sl,pl; /* 船运行一个来回后河左岸的野人、传教士的人数 */ int ssr,spr; /* 回来(由左向右时)船上的人数 */ int sst,spt; /* 去时(由右向左时)船上的人数 */ int loop; /* 本结点所在的层数 */ struct SPQ *upnode ,*nextnode;/* 本结点的父结点和同层的下一个结点的地址 */ spq; int loopnum;/* 记录总的扩展次数 */ int openednum;/* 记录已扩展节点个数 */ int unopenednum;/* 记录待扩展节点个数 */

7、int resultnum; struct SPQ *opened; 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(); void addtoopened(struct

8、 SPQ *ntx) /*扩展节点*/ unopened = unopened - nextnode; unopenednum-; if (openednum = 0 ) oend = opened = ntx; oend - nextnode = ntx; oend = ntx; openednum+; void recorder() int i , loop; struct SPQ *newnode; struct SPQ *ntx; loop = oend - loop; ntx = oend; resultnum = 0; for( i = 0 ; i sr = ntx - sr; p

9、r = ntx - pr; sl = ntx - sl; pl = ntx - pl; sst = ntx - sst; spt = ntx - spt; ssr = ntx - ssr; spr = ntx - spr; nextnode = NULL; ntx = ntx - upnode; if(i = 0) result = newnode; nextnode = result; resultnum+; void releasemem() int i; struct SPQ* nodefree; for ( i = 1 ; openednum ; nodefree = opened;

10、opened = opened - free(nodefree); for ( i = 0 ; unopenednum ; nodefree = unopened; void showresult() /*显示*/ int fsr , fpr ; /* 在右岸上的人数 */ int fsl , fpl ; /* 在左岸上的人数 */ %d个传教士,result - pr);%d个野人 sr); pl); sl); resultnum ; nodefree = result; result = result -nnt左岸人数 船上人数及方向 右岸人数n第%d轮n,i); fpl = result

11、 - 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 goo

12、n() /*循环操作选择*/ char choice; for(;) 是否继续?(Y/N)n scanf (%s , &choice); choice=toupper(choice); if(choice=Y)break;N)exit(0);int main() int flag; /* 标记扩展是否成功 */ for( ; ; ) initiate(); flag = search (); if(flag = 1) recorder(); releasemem(); showresult(); goon(); else 无法找到符合条件的解 system(pausereturn 0;void

13、 initiate() int x; uend = unopened = (struct SPQ*)malloc(sizeof(spq); if(uend=NULL) 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题目:设有n个传教士和m个野人来到河边,打算乘一只

14、船从右岸到左岸去。该船的负载能力为两人。在任何时候,如果野人人数超过传教士人数,野人n就会把传教士吃掉。他们怎样才能用这条船安全的把所有人都渡过河去n*n默认的n、m值皆为3nn是否修改?(Y/N) scanf(,&n请输入传教士人数%dx); if(x0) pr = x; break; else printf(n输入值应大于0!n请重新输入n请输入野人人数 sr = x; int search() /* 提供将要扩展的结点的指针 */ ntx = unopened; /* 从待扩展链表中提取最前面的一个 */ if(ntx-loop = maxloop) return 0; addtoope

15、ned(ntx); /* 将ntx加入已扩展链表,并将这个节点从待扩展链表中去掉 */ flag = stretch(ntx); /* 对ntx进行扩展,返回-1,0,1 */ return 1; int stretch(struct SPQ *ntx) int sst , spt ; /* 出发时在船上的人数 */ int ssr , spr ; /* 返回时船上的人数 */ for (sst = 0 ; sst fpr = ntx - fsl = ntx - fpl = ntx - if (sst = fsr) & ( 2 - sst) pl = opened - sst = sst; s

16、pt = spt; loop = ntx - loop + 1; nextnode = newnode; oend = newnode; else if (fpr - fsr) * fpr = 0) /* 判断是否满足传教士人数必须大于或等于野人人数 */ fsl = fsl + sst; fpl = fpl + spt; for (ssr = 0 ; ssr = 1 ; ssr+) /* 返回 */ int ffsl , ffpl; if (ssr = fsl) & (1 - ssr) = 0) /* 若符合条件则分配内存并付值 */ int ffsr , ffpr; ffsr = fsr + ssr; ffpr = fpr + spr; sr = ffsr; pr = ffpr; sl = ffsl; pl = ffpl; ssr = ssr; spr = spr; loop

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1