人工智能代码.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验一、过河问题 一、问题描述 有三个牧师和三个野人过河,只有一条能装下两个人的船,在河的任何一方或者船上,如果野人的人数大于牧师的认输,那么牧师就会有危险.找出一种按的渡河方法。 将该问题转变为:假如有n个牧师和n个野人准备渡河,但只有一条能容纳c个人的小船,为了防止野人侵犯牧师,要求无论在何处,牧师的人数不得少于野人的人数(除非牧师人数为0),且假定两种人都会划船,试设计一个算法,确定它们能否渡过河去,若能,则给出一只小船来回次数最少的最佳方案。 二、基本要求 输入:牧师人数(即野人人数)n,小船一次至多载客人数c。 输出:若问题无解,则显示“渡河失败”信息,否则,输出一组最佳方案,用三组(X1,X2,X3)表示渡河过程中的状态。并用箭头输出这些状态之间的迁移:目的状态- -中间状态 - -初始状态。 例:当n=2,c=2时,输出 000-021-211-110-221 上述(X1,X1,X2)表示渡河过程中各个状态。 其中:X1表示始岸上牧师人数,X2表示始岸上野人人数, X3表示小船位置,(0-在目的岸,1-在起始岸 ) 三、算法描述 (1)算法基本思想的文字描述; 从初始状态S(n,n,1)出发,形成的有合法且未达状态S11、S12、……、Sli。再分别从S11、S12、……、Sli出发形成所有合法而未达状态S111、S112、…… 、Sli1、Sli2、Sli ……最终达到目标(0,0,0)(有解),或者找不到合法而未达状态(无解)。若有解,则从目标返回找前趋状态,前趋状态的前趋状态……直到初始状态。 (2)判别(X1,X2,X3)为合法状态条件:X1=0或X1=n或X1=X2。 (3)数据结构: 1 栈STACK,记下“已达”状态及踪迹,并兼作队列。 2 STATE[X1][X2]= (4)算法基本思想的具体实现: 1 初始化:置STATE[N+1][N+1][2]中的有状态为“未达” 置队列STACK空,cond为当前是否已达到目标: cond= cond置初值 2 以S(n,n,1)为始点,置STATE为“已达”。S入队列STACK 3 while(队列STACK空且未达到目标时) A{ 取出队头元素地址=p1,队头元素出队列 B while(未达到目标,且P1有可达、合法、且未到达过的相邻顶点Q) if (Q=(000) 则{cond=1,Q入队列} 否则 {置QW为“已达”,Q入队列} /* B可用函数COMBINE实现 */ if (cond=1)则按队列中前趋指针指示的次序依次输出序列,否则输出“渡河失败”。 COMBINE函数的功能等价于从数量不等的物品,分别选出1件、2件、……C件物品的所有组合,同时对每一种组合确定其合法性。 COMBINE( ) { 1 栈SP初始化(SP存放已放入物品序号),NUM为已取出物品个数,NUM=0,i为准备取出物品序号,i=1。 2 do { while (未达到目标,且所有物品还未取尽,且NUMC) {若该种物品已取尽,则取下一种,i++; 取出第i种物品中一件来,该物来序号(即i)进栈,NUM++; 判断该状态合法否?! /* 用函数dicision实现 */ } if (未达到目标,且栈SP不空) {则读栈SP=i,将第种物品放回一件:NUM--:退栈;i++;} }while(未达到目标,且并非所有情况均已列举完) } dicision ( ) { if (当前状态(x1,x2,x3)合法且未达) 则(x1,x2,x3)及前趋指针入队列STACK; if ((x1,x2,x3)==0,0,0)) 则 cond=1; } 四、源程序 #include stdio.h typedef struct node { int np; /* The normal peoples number at start shore. */ int mp; /* The mad peoples number at start shore. */ int shore; /* 0=end shore,1=start shore */ int track; /* The track of the point */ }NODE; NODE stack[80]; /* The massage from stack[1]*/ int state[80][80][2],n,c,front,bac

文档评论(0)

ffpg + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档