- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
农夫过河实验报告——数据结构
PAGE
PAGE 7
数据结构实验报告
——实验四农夫过河的求解
本实验的目的是进一步理解顺序表和队列的逻辑结构和存储结构,进一步提高使用理论知识指导解决实际问题的能力。
一、【问题描述】
一个农夫带着一只狼、一只羊和一棵白菜,身处河的南岸。他要把这些东西全部运到北岸。他面前只有一条小船,船只能容下他和一件物品,另外只有农夫才能撑船。如果农夫在场,则狼不能吃羊,羊不能吃白菜,否则狼会吃羊,羊会吃白菜,所以农夫不能留下羊和白菜自己离开,也不能留下狼和羊自己离开,而狼不吃白菜。请求出农夫将所有的东西运过河的方案。
二、【数据结构设计】
求解这个问题的简单的方法是一步一步进行试探,每一步搜索所有可能的选择,对前一步合适的选择再考虑下一步的各种方案。
要模拟农夫过河问题,首先需要对问题中每个角色的位置进行描述。一个很方便的办法是用四位二进制数顺序分别表示农夫、狼、白菜和羊的 位置。用0表示农夫或者某东西在河的南岸,1表示在河的北岸。例如整数5(其二进制表示为0101) 表示农夫和白菜在河的南岸,而狼和羊在北岸。
现在问题变成:从初始状态二进制0000(全部在河的南岸) 出发,寻找一种全部由 安全状态构成的状态序列,它以二进制1111(全部到达河的北岸)为最终目标,并且在序列中的每一个状态都可以从前一状态到达。为避免瞎费功夫,要求在序列中不出现重复的状态。
实现上述求解的搜索过程可以采用两种不同的策略:一种是 广度优先(breadth_first) 搜索,
另一种是 深度优先(depth_first) 搜索。本书只介绍在广度优先搜索方法中采用的数据结构设计。
广度优先就是在搜索过程中总是首先搜索下面一步的所有可能状态,再进一步考虑更后面的各种情况。要实现广度优先搜索,可以使用 队列。把下一步所有可能的状态都列举出来,放在队列中,再顺序取出来分别进行处理,处理过程中把再下一步的状态放在队列里……。由于队列的操作遵循先进先出的原则,在这个处理过程中,只有在前一步的所有情况都处理完后,才能开始后面一步各情况的处理。这样,具体算法中就需要用一个整数队列moveTo,它的每个元素表示一个可以安全到达的中间状态。另外还需要一个数据结构记录已被访问过的各个状态,以及已被发现的能够到达当前这个状态的路径。由于在这个问题的解决过程中需要列举的所有状态(二进制0000 -1111)一共16种,所以可以构造一个包含16个元素的整数顺序表来实现。顺序表的第i个元素记录状态i是否已被访问过,若已被访问过则在这个顺序表元素中记入前驱状态值,把这个顺序表叫做route。route的每个分量初始值均为-1。route的一个元素具有非负值表示这个状态已访问过,或是正被考虑。最后可以利用route顺序表元素的值建立起正确的状态路径。于是得到 农夫过河问题的广度优先算法。
在具体应用时,采用链队和顺序队均可,为叙述的方便,不妨设为使用顺序队。
三、【功能(函数)设计】
1、确定农夫、狼、羊和白菜位置的功能模块。
用整数location表示上述四位二进制描述的状态,由于采用四位二进制的形式表示农夫、狼、白菜和羊,所以在要使用位操作的“与”操作来考察每个角色所在位置的代码是0还是1。函数返回值为真表示所考察的角色在河的北岸,否则在南岸。例如某个状态和1000做“与”操作后所得结果为0,则说明农夫的位置上的二进制数为0,即农夫在南岸,如果所得结果为1,则说明农夫的位置上的二进制数为1,即农夫在北岸。狼、羊和白菜的处理办法以此类推。可以如下设计函数:
int farmer(int location) {
return (0 != (location 0x08));
}
int wolf(int location) {
return (0 != (location 0x04));
}
int cabbage(int location) {
return (0 != (location 0x02));
}
int goat(int location) {
return (0 !=(location 0x01));
}
2、确定安全状态的功能模块。
此功能模块通过位置分布的代码来判断当前状态是否安全。若状态安全返回1,状态不安全返回0。可以如下设计函数:
int safe(int location) // 若状态安全则返回1
{ if((goat(location) = = cabbage(location)) (goat(location)!=farmer(location)))
return (0); // 羊吃白菜
if((goat(location) = = wolf(locatio
您可能关注的文档
最近下载
- 监理大纲水库工程.doc
- TB 10307-2020《铁路通信、信号、信息工程施工安全技术规程》.pdf VIP
- 第4课 两汉统一多民族封建国家的巩固 课件 中职高一高教版中国历史全一册.ppt
- 大学语文《老子》课件(共37张精选课件).pptx VIP
- 2010哈弗h5维修手册新增部分.pdf VIP
- 复方倍他米松双注射:早期原发性冻结肩短期疗效的深度剖析.docx VIP
- 入党积极分子思想汇报(4篇,四个季度)范文.doc VIP
- 诊断学-第四篇 实验诊断 第二章 临床血液学检测(1-2节).pptx VIP
- 入党志愿书表格电子版空白表格样本.docx VIP
- 公共建筑能源审计技术通则 DB11 T 1007-2024.pdf VIP
文档评论(0)