农夫携物过河问题-数据结构与算法课程设计报告.doc

农夫携物过河问题-数据结构与算法课程设计报告.doc

  1. 1、本文档共24页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
农夫携物过河问题-数据结构与算法课程设计报告

合肥学院 计算机科学与技术系 课程设计报告 2009 ~2010 学年第二学期 课程 数据结构与算法 课程设计名称 农夫携物过河问题 学生姓名 程梦云 学号 0804012045 专业班级 08计科(2) 指导教师 王昆仑 张贯虹 2010年5月 题目:农夫携物过河问题 内容:有一农夫要将自己的兔子、蔬菜和狐狸等3件物品运过河。但农夫过河时所用的船每次最多只能装其中的一件物品,而这3件物品之间又存在一定的制约关系:兔子不能单独和狐狸以及不能和蔬菜在一起,因为狐狸要吃兔子,兔子也能吃蔬菜。试构造出问题模式以编程实现这一问题的求解。 一、问题分析和任务定义 根据对象的状态分为过河(1)和不过河(0),此对象集合就构成了一个状态空间。问题就是在这个状态空间内搜索一条从开始状态到结束状态的安全路径。显然,其初始状态为四对象都不过河,结束状态为四对象全部过河。这里利用图的广度优先算法思想处理,并采用队列存储,灵活运用二进制的特点完美解决问题。对于农夫,狐狸,兔子,蔬菜组成一个4位二进制代码,即4位二进制数分别代表了农夫、狐狸、白菜和兔子,状态空间为16,初始状态为(0000),目标为(1111)。解决问题的方法是,首先将初始状态(0000)入队(第一层),再将由初始状态(0000)可达到的所有安全状态入队(第二层),能由已有的安全状态到达的安全且不重复的所有状态入队(第三层),依次如此直到状态(1111)为止。对当前对象是否安全的判断,若当农夫与兔子不在一起时,狐狸与兔子或兔子与蔬菜在一起是不安全的,其他情况是安全的。 二、概要设计和数据结构的选择 求解这个问题的最简单的方法是一步一步进行试探,每一步都搜索所有可能的选择,对前一步合适的选择再考虑下一步的各种方案。用计算机实现上述求解的搜索过程可以采用两种不同的策略:一种是广度优先(breadth_first) 搜索,另一种是深度优先(depth_first) 。此处采用广度优先算法。 广度优先的含义就是在搜索过程中总是首先搜索下面一步的所有可能状态,然后再进一步考虑更后面的各种情况。要实现广度优先搜索,一般都采用队列作为辅助结构。把下一步所有可能达到的状态都列举出来,放在这个队列中,然后顺序取出来分别进行处理,处理过程中把再下一步的状态放在队列里……。由于队列的操作遵循先进先出的原则,在这个处理过程中,只有在前一步的所有情况都处理完后,才能开始后面一步各情况的处理。 要模拟农夫过河问题,首先需要选择一个对问题中每个角色的位置进行描述的方法。一个很方便的办法是用四位二进制数顺序分别表示农夫、狼、白菜和羊的位置。例如用0表示农夫或者某东西在河的南岸,1表示在河的北岸。因此整数5(其二进制表示为0101) 表示农夫和白菜在河的南岸,而狼和羊在北岸。 表1 物品的所有位置状态 农夫、狐狸、白菜、兔子 Location 农夫、狐狸、白菜、兔子 Location 0000 0 1000 8 0001 1 1001 9 0010 2 1010 10 0011 3 1011 11 0100 4 1100 12 0101 5 1101 13 0110 6 1110 14 0111 7 1111 15 ⑴数据结构的选择:本程序采用队列处理。 typedef struct node // 顺序队列类型定义 { int f, r; //定义头尾指针 int data[maxlen]; }SeqQueue; ⑵为了实现上述程序的功能,需要:①队列的创建、判空、入队、出队、取队首元素;②判断农夫、狐狸、白菜和兔子的位子,并以此来判断该状态是否安全;③按位子输出农夫、狐狸、;④主函数,一个广度优先的过程; 各函数关系如下: 图1 各函数关系图 三、详细设计和编码 完成了上面的准备工作,现在的问题变成: 从初始状态二进制0000(全部在河的南岸) 出发,寻找一种全部由安全状态构成的状态序列,它以二进制1111(全部到达河的北岸) 为最终目标,并且在序列中的每一个状态都可以从前一状态通过农夫(可以带一样东西)划船过河的动作到达。并且要求在序列中不应该出现重复的状态。算法分析如图2。 为了实现广度优先搜索,算法中需要使用了一个整数队列Q,它的每个元素表示一个可以安全到达的中间状态。另外还需要一个数据结构记录已被访问过的各个状态,以及已被发现的能够到达当前这个状态的路径。 由于在这个问题的解决过程中需要列举的所有状态(二进制0000 ~ 1111)一共16种,所以可以构造一个包含16个元素的整数顺序表来满足以上的要求。用顺序表的第i个元素记录状态i是否已被访问过,若已被访问过则在这个顺序表元素中记入前驱状态值,算法中把这个顺序表叫做v

文档评论(0)

pangzilva + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档