




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.传教士与野人过河问题实验报告1 问题定义河的两岸有三个传教士和三个野人需要过河,目前只有一条能装下两个人的船,在河的任何一方或者船上,如果野人的人数大于传教士的人数,那么传教士就会被野人攻击,怎么找出一种安全的渡河方案呢?2 算法分析首先,先来看看问题的初始状态和目标状态,定义河的两岸分别为左岸和右岸,设定状态集合为(左岸传教士人数,右岸野人数,右岸传教士人数,右岸野人数,船的位置),船的位置:-1表示船在左岸,1表示船在右岸。初始状态:(3,3,0,0,0,-1)目标状态:(0,0,3,3,1)然后,整个问题就抽象成了怎样从初始状态经中间的一系列状态达到目标状态。问题状态的改变是通过划船渡河来引发的,所以合理的渡河操作就成了通常所说的算符,根据题目要求,可以得出以下5个算符(按照渡船方向的不同,也可以理解为10个算符):渡1野人、渡1传教士、渡1野人1传教士、渡2野人、渡2传教士根据船的位置,向左移或向右移通过递归依次执行5种算符,判断是否找到所求,并排除不符合实际的状态,就可以找到所有可能的解,如图1所示为递归函数流程图。数据结构方面采用如下所示的结构体存储当前传教士、野人、船三者的状态。struct riverSides int churchL;/左岸传教士数int wildL;/左岸野人数int churchR; /右岸传教士数int wildR; /右岸野人数int boat;/船的位置,-1在左岸,1在右岸;图 1 传教士与野人过河递归函数流程图3 编程实现程序使用C+实现,具体代码如下:#include#include#includeusing namespace std;struct riverSidesint churchL;/左岸传教士数int wildL;/左岸野人数int churchR; /右岸传教士数int wildR; /右岸野人数int boat;/船的位置,-1在左岸,1在右岸;int mycount = 0;/统计成功过河次数int CvsWdfs(riverSides lastcurrentState, vector lastParameters, vector operation, int ifboacurrentStatety)if (lastcurrentState.churchR = 3 & lastcurrentState.wildR = 3)mycount+;cout 第 mycount 次成功过河 endl;cout 传教士 野人 | 移动方向 endl;for (int i = 0; i operation.size(); i+)cout operationi endl;cout endl;return 0;/判断过河操作否重复,去除死循环for (int i = 0; i lastParameters.size() - 1; i+)if (lastParametersi.wildL = lastcurrentState.wildL&lastParametersi.churchL = lastcurrentState.churchL)if (lastcurrentState.boat = lastParametersi.boat)return 0;/检验人数数据合法性if (lastcurrentState.churchL 0 | lastcurrentState.wildL 0 | lastcurrentState.churchR 0 | lastcurrentState.wildR 0)return 0;/传教士是否被吃if (lastcurrentState.churchL lastcurrentState.wildL&lastcurrentState.churchL != 0) | (lastcurrentState.churchR 右岸);elseoperation.push_back( 2 0 | 右岸-左岸);currentState.churchL = lastcurrentState.churchL - 2 * lastcurrentState.boat;currentState.wildL = lastcurrentState.wildL;currentState.churchR = lastcurrentState.churchR + 2 * lastcurrentState.boat;currentState.wildR = lastcurrentState.wildR;currentState.boat = -lastcurrentState.boat;lastParameters.push_back(currentState);CvsWdfs(currentState, lastParameters,operation, 0);operation.pop_back();lastParameters.pop_back();/两个野人过河if (lastcurrentState.boat = 1)operation.push_back( 0 2 | 左岸-右岸);elseoperation.push_back( 0 2 | 右岸-左岸);currentState.churchL = lastcurrentState.churchL;currentState.wildL = lastcurrentState.wildL - 2 * lastcurrentState.boat;currentState.churchR = lastcurrentState.churchR;currentState.wildR = lastcurrentState.wildR + 2 * lastcurrentState.boat;currentState.boat = -lastcurrentState.boat;lastParameters.push_back(currentState);CvsWdfs(currentState, lastParameters, operation, 0);lastParameters.pop_back();operation.pop_back();/一个野人,一个传教士if (lastcurrentState.boat = 1)operation.push_back( 1 1 | 左岸-右岸);elseoperation.push_back( 1 1 | 右岸-左岸);currentState.churchL = lastcurrentState.churchL - 1 * lastcurrentState.boat;currentState.wildL = lastcurrentState.wildL - 1 * lastcurrentState.boat;currentState.churchR = lastcurrentState.churchR + 1 * lastcurrentState.boat;currentState.wildR = lastcurrentState.wildR + 1 * lastcurrentState.boat;currentState.boat = -lastcurrentState.boat;lastParameters.push_back(currentState);CvsWdfs(currentState, lastParameters,operation, 0);operation.pop_back();lastParameters.pop_back();/一个传教士过河if (lastcurrentState.boat = 1)operation.push_back( 1 0 | 左岸-右岸);elseoperation.push_back( 1 0 | 右岸-左岸);currentState.churchL = lastcurrentState.churchL - 1 * lastcurrentState.boat;currentState.wildL = lastcurrentState.wildL;currentState.churchR = lastcurrentState.churchR + 1 * lastcurrentState.boat;currentState.wildR = lastcurrentState.wildR;currentState.boat = -lastcurrentState.boat;lastParameters.push_back(currentState);CvsWdfs(currentState, lastParameters, operation, 0);operation.pop_back();lastParameters.pop_back();/一个野人过河if (lastcurrentState.boat = 1)operation.push_back( 0 1 | 左岸-右岸);elseoperation.push_back( 0 1 | 右岸-左岸);currentState.churchL = lastcurrentState.churchL;currentState.wildL = lastcurrentState.wildL - 1 * lastcurrentState.boat;currentState.churchR = lastcurrentState.churchR;currentState.wildR = lastcurrentState.wildR + 1 * lastcurrentState.boat;currentState.boat = -lastcurrentState.boat;lastParameters.push_back(currentState);CvsWdfs(currentState, lastParameters, operation, 0);operation.pop_back();lastParameters.pop_back();return 0;int main()int churchL = 3, wildL = 3, churchR = 0, wildR = 0;/分别用来计算左岸和右岸的传教士和野人vector lastParameters;/保存每一步移动操作的两岸传教士、野人人数vector operation;/保存当前操作的描述/初始化左岸参数,可以认为是从右岸移动至左岸的操作/boat=-1 表示船在左岸,boat=1表示船在右岸riverSides currentState;currentState.churchL = 3;currentState.wildL = 3;currentState.churchR
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度金融行业财务数据安全防护及保密承诺合同
- 2025年宾馆布草洗涤节能改造与能源消耗控制服务合同
- 2025年度特色餐厅服务员专业培训及星级评定晋升合同
- 2025年度智能绿色节能建材采购合同
- 2025年生态景观规划设计及施工一体化服务合同
- 2025年智慧员工考勤管理系统软件采购与实施合同
- 2025年智能设备操作系统稳定性评估及优化服务合同
- 2025年茶具品牌跨境电商销售与推广服务合同
- 2025年新型节能环保物流仓储服务全面合作协议
- 2025年度环保设备维护与绿色节能改造工程承包合同
- 2025海航航空食品(北京)有限公司招聘260人笔试参考题库附答案解析
- 2025至2030中国压力袜(弹性袜)行业项目调研及市场前景预测评估报告
- 房屋抵押的合同(标准版)
- 中国土地荒漠化课件
- 2025晋中祁县司法协理员招聘笔试备考试题及答案解析
- Unit 3 Same or DifferentSection A Grammar Focus (3a-3c) 课件-2025-2026学年人教版八年级英语上册
- GA/T 2160-2024法庭科学资金数据检验规程
- 工作责任心主题培训ppt课件(PPT 26页)
- 除尘器基础知识培训资料(54页)ppt课件
- 完整解读新版《英语》新课标2022年《义务教育英语课程标准(2022年版)》PPT课件
- 2011版义务教育生物课程标准word版
评论
0/150
提交评论