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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

三件有制约关系物品过河问题Word格式.docx

1、问题的模型建立:为了方便解决问题,又结合实际问题的特征,我们可以将这个问题模型化。首先,采用二进制中的0/1表示每一个物体的两种状态,用一个四位的二进制数表示一种整体的状态,这样就使原来的问题变的更加易于理解,有利于我们找到合适的数据结构类型来实现问题。根据对象的状态分为过河(1)和不过河(0),此对象集合就构成了一个状态空间。问题就是在这个状态空间内搜索一条从开始状态到结束状态的安全路径。显然,其初始状态为四个对象都不过河(都为0),结束状态为四对象全部过河(都是1)。状态到下一状态可以通过合法的途径获得,即搜索条件明确。 这其中可以根据相互之间的制约关系,排除不合法的状态。通过分析得到的各

2、种状态间的关系转换图如下图系统状态转换关系图其中双向的箭头表示状态可逆,即农夫可以带着某种东西过去,也可以带着该东西回来。箭头上的字母表示农夫所携带的东西:Fa (Farmer) ,Fo(Fox) ,R(Rabbit),V(Vegetable)分别表示农夫自己、农夫携带狐狸、农夫携带兔子、农夫携带菜过河。5.调试通过的源程序 #include#define VEX_NUM 10 /最大顶点数typedef enum FALSE,TRUE Boolean;typedef struct int Farmer,Fox,Rabbit,Veget;VexType;/定义结点typedef structi

3、nt vexnum,e;VexType vexsVEX_NUM;int adjVEX_NUMVEX_NUM;AdjGraph;/图的存储结构邻接矩阵Boolean visitedVEX_NUM;int pathVEX_NUM,yVEX_NUM;int locate(AdjGraph *G,int Fa,int Fo,int R,int V) /查找顶点(Farmer,Fox,Rabbit,Vegetable)在顶点向量中的位置int i;for(i=0;ivexnum;i+)if(G-vexsi.Farmer=Fa&vexsi.Fox=Fo&vexsi.Rabbit=R&vexsi.Veget

4、=V)return(i);return(-1);int is_safe(int Fa,int Fo,int R,int V)if(Fa!=R&(Fo=R|R=V)/fa!=r?return(0);elsereturn(1);int is_connected(AdjGraph *G,int i,int j)int k;y0=0;k=0;vexsi.Fox!=G-vexsj.Fox)k+;vexsi.Rabbit!vexsj.Rabbit)vexsi.Veget!vexsj.Veget)vexsi.Farmer!vexsj.Farmer&k=1)void CreatG(AdjGraph *G)in

5、t i,j, Fa,Fo,R,V;i=0;for(Fa=0;Fa=1;Fa+)/形成所有安全的状态结点for(Fo=0;FoFo+)for(R=0;RR+)for(V=0;Vvexsi.Rabbit=R;vexsi.Veget=V; i+;vexnum=i;for(j=0;jadjji=1;adjji=0;return;void print_path(AdjGraph *G,int u,int v)/输出从u到v的简单路径 int k,i=1;k=u;printf(t 状态变化图n); (1表示到达对岸,0表示在原岸)nt农夫 狐狸 兔子 蔬菜t 农夫 狐狸 兔子 蔬菜nwhile(k!=v)

6、t( %d, %d , %d , %d ) ,G-vexsk.Farmer,G-vexsk.Fox,G-vexsk.Rabbit,G-vexsk.Veget);if(!k)tt均在原岸t nvexsk.Farmer) 在对岸else if(i1&vexsyi-1.Farmer) 回原岸 else printf( 在原岸vexsk.Fox)else printf( if(G-vexsk.Rabbit)vexsk.Veget) 在对岸 在原岸 n t t tt nk=pathk;yi+=pathk;t( %d, %d , %d , %d )t printf(t 均到达对岸t nvoid DFS_p

7、ath(AdjGraph *G,int u,int v)/求从u到v的简单路径int j;visitedu=TRUE;adjuj& !visitedj &visitedv)pathu=j;DFS_path(G,j,v);void main()int i,j;AdjGraph graph;CreatG(&graph);graph.vexnum;visitedi=FALSE;i=locate(&graph,0,0,0,0);j=locate(&graph,1,1,1,1);DFS_path(&graph,i,j);if (visitedj)print_path(&6.运行结果7.程序的优缺点 程序

8、明确了该题目的基本要求,友好的界面让大家清晰的知道了农夫、狐狸、兔子、蔬菜的过河顺序。但是,输出的路径只有一个,因为两条路径基本相同,所以为了程序的复杂程度,我们就只输出一条。另为,虽然我们已经尽力使界面美观,形象的输出问题的解,但总还不是太形象。8.程序的时空性能由于程序的规模很小,所以涉及到的数据也很少,所以时间复杂度和空间复杂度实际上也应该很小。对于此程序中的具体算法,比如说,深度优先搜索,DFS_path(),由于采用的是邻接矩阵的存储方式,所以它找到每个顶点的所需时间是O(n),其中n为顶点数。如果此程序涉及到一个大宗的数据,O(n)确实是比较大,但本问题只涉及到最多16个数据,所以

9、对于这个程序而言,时间复杂度和空间复杂度都不是最为主要的问题。但我们还是要坚持利用时间复杂度和空间复杂度很小的算法,以体现编程中的。9.改进思想由于本程序解决的这个问题功能单一,所以拓展的空间有限。但我们仍然有扩张之处:一、因为程序中输出的路径是一条,但实际上存在两条路径。但我们观察一下这两条路径.第一条:(0000)(1010)(0010)(1011)(0001)(1101)(0101)(1111)第二条:(0000)(1010)(0010)(1110)(0100)(1101)(0101)(1111)这其中只有两个不同,只在于是先将Fox带过去,还是先将Veget带过去,只是时间顺序的问题,

10、对于其他的方面没有任何影响。所以这个对于题目中的问题似乎没有扩展之处,但延伸到其他问题,可能会出现路径长度不同等问题,这样对于用户可能就希望得到代价最短的那条路径。这时,我们打算将每条路径输出,然后供用户选择其中最理想的一条。考虑到算法,我们可以利用邻接表作为图的存储方式,然后从起始位置开始,深度优先搜索,搜索到最终位置是,输出这条路径,然后从起始位置的另为一个后继开始,进行深度优先搜索,然后循环,直到输出所有路径。二、考虑到实际情况,每一条路径对农夫可能要付出不同的劳动力。比如说,农夫可能希望多带几次Veget过去,也不愿带一次Fox过去。而就此题而言,这种情况也不会发生,在观察一下他的两条

11、路径: 第二条:带兔子过河 带兔子过河 乘船自己回原岸 乘船自己回原岸带蔬菜过河 带狐狸过河带兔子回原岸 带兔子回原岸带狐狸过河 带蔬菜过河自己回原岸 自己回原岸带兔子过河 带兔子过河很明显,这只是狐狸,蔬菜过河的时间顺序交换,与最终结果,对农夫来说的劳动力没有任何影响。但如果真的存在劳动力不同的路径,我们的算法就会做出相应的改变。和这道题不同的是,从一种状态转移到另一种我们都要赋予一定的权值,这样从初始状态到最终状态就有一个表示劳动力付出的值,我们也将用网(边上带权值的图)这种数据结构,同样使用邻接表的存储结构,这样就可以求出每一条路径的同时,一同得到路径长度。这样可以使用户选择路径长度最短

12、的那条。另外,我们可以选择用Dijkstra(迪杰斯特拉)算法求最短路径,这样就可以方便用户找到最轻松实现自己的目的的路径。三对于四件有制约关系的物品过河问题,相对于三件更加复杂,但解决问题的思路大致相同。只是细节上更加复杂.10.心得体会 数据结构是计算机学科的一门综合性的专业基础课,也是计算机学科的核心课程,在整个学科知识体系中占据非常重要的地位。通过该课程的学习,不仅为后续课程打好理论基础,而且进一步提高数据抽象能力和程序设计能力。数据结构课程内容多、概念多、方法多、高度抽象、逻辑性强、技巧性强、实践性强。 而最为有效的方法就是实践。的确,每一次从这样为期一个星期的集中上机,我们都收获颇

13、丰。一方面就是对数据结构的一些概念,数据结构和算法的思想理解的更加深刻,另一方面,也极大的锻炼了我们的实际动手操作能力。这对于工科要求我们要有极强的动手能力是完全吻合的。 通过这次集中上机,更加认识到数据结构的重要性,他的确是语言更加容易表达出来。比如说,栈这种数据结构,先进后出的线性表。假如我们对此不了解,那解决一些问题就会是工程量很大,浪费很多时间,但效果可能还不是十分理想,但栈就为我们解决一大类问题提供了捷径。比如说,括号匹配问题啊,八皇后问题啊,都很能体现数据结构,栈的独特之处,优先之处。 当然,对于我们刚刚学习数据结构一个学期的新手,对一个问题立即找到最佳的数据结构类型来实现它显然存

14、在一定的困难,但通过自己仔细的分析,加上一些信息的参考,我们最终还是完成了我们的选的任务。虽然我们的程序中也许不够完美,但通过一星期的努力,我们还算圆满完成了我们的任务,这总会有一种成就感,也总能激起我们的热情。但通过这个,我们还有了更大的收获,就是要考虑另一个方面的问题,用户,公司。有时,你的程序要切实的考虑到用户群,可能用户没有计算机基础。所以,程序首要考虑的要加入用户。当然,公司有时要求我们要有十分漂亮的界面,可能有时我们只考虑到整个程序的功能是否完善,而忽略了用户期望的。这也是人性化的一方面,更是我们值得思考和改进的地方。总之,做什么事情都要对认真,既然是该你做的事,肯定是你应该有这个能力,即使能力不够,也是应该借这个机会来培养。所以放心大胆地做,对自己有信心,就有动力。有人说,世上的事就怕认真二字。确实,做什么,只是认真地去做,踏踏实实,戒躁戒躁,静静地思考,慢慢地进步,真的是天下无难事。这就是我这次课程设计中得到的最大的体会,受益匪浅。

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

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