人样狼草过河数学建模new.docVIP

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
人样狼草过河数学建模new.doc

课 程 设 计 报 告 课程名称:数学建模 设计题目:人狼羊草过河问题 姓名学号:马高松(200705030) 易文辉(200705050) 陈邦生(200705010) 指导老师:李沐春 完成时间:2010年5月8日 问题的提出 在河的一岸,人、狼、羊、草、均要过河,船需人划,而且最多载一物,当人不在时,狼会吃羊,羊会吃草;试安排人狼羊草安全渡河。 一 问题的分析 人带着狼、羊和,身处河的岸。他要把这些东西全部运到岸。问题是他面前只有一条小船,船小到只能容下他和一件物品,另外。,因为狼能吃羊,而羊爱吃,所以不能留下羊和或者狼和羊单独在河的一边完成了上面的准备工作,要模拟农夫过河问题,首先需要选择一个对问题中每个角色的位置进行描述的方法。一个很方便的办法是用四位二进制数顺序分别表示的位置。例如用0表示或者某在河的南岸,1表示在河的北岸。因此整数(其二进制表示为) 表示的南岸,而在北岸。现在的问题变成: 从初始状态二进制0000(全部在河的南岸) 出发,寻找一种全部由安全状态构成的状态序列,它以二进制1111(全部到达河的北岸) 为最终目标,并且在序列中的每一个状态都可以从前一状态通过(可以带一样东西)划船过河的动作到达。 算法选择求解这个问题的最简单的方法是一步一步进行试探,每一步都搜索所有可能的选择,对前一步合适的选择再考虑下一步的各种方案。 用计算机实现上述求解的搜索过程可以采用两种不同的策略:一种是广度优先搜索,另一种是深度优先。广度优先的含义就是在搜索过程中总是首先搜索下面一步的所有可能状态,然后再进一步考虑更后面的各种情况。 要实现广度优先搜索,一般都采用队列作为辅助结构。把下一步所有可能达到的状态都列举出来,放在这个队列中,然后顺序取出来分别进行处理,处理过程中把再下一步的状态放在队列里。 由于队列的操作遵循先进先出的原则,在这个处理过程中,只有在前一步的所有情况都处理完后,才能开始后面一步各情况的处理。?五、程序代码#includeiostream using namespace std; int man(int n){ return (0!=(n 8));// 判断农夫在不在,如果返回1,则表示农夫在。 } int wolf(int n){ return (0!=(n 4)); } int sheep(int n){ return (0!=(n 2)); } int grass(int n){ return (0!=(n 1)); } //安全检验 int isSafe(int n){ if(sheep(n)==grass(n) sheep(n)!=man(n)) return 0; if(sheep(n)==wolf(n) wolf(n)!=man(n)) return 0; return 1;//1表示安全,0表示不安全 } //过河,使用广度优深算法遍历 int crossRiver(int result[]){ int Status,nextStatus,choice[]={8,9,10,12};//农夫从某一状态出发,有4种走法 int queue[16],front,rear;//定义循环队列 int i,j,visited[16];//visited[i]=0表示i未访问过 int route[16];//route[i]表示第i步的前一步,意即往第i步走的方式 rear=front=0;//队列初始化 for(i=0;i16;i++){ route[i]=-1; visited[i]=0; } Status=0;nextStatus=-1; //从状态0(全部在南岸)开始 queue[rear]=Status; rear=(rear+1)%16;//入队 while(front!=rear){ Status=queue[front];front=(front+1)%16;//出队 visited[Status]=1; //访问 for(j=0;j4;j++){ nextStatus=Status^choice[j]; //从curStatus状态到下一状态nextStatus if(visited[nextStatus]==0 isSafe(nextStatus)){ queue[rear]=nextStatus; rear=(rear+1)%16;//入队 route[nextStatus]=Status;//仅表示从Sattus可以走到nextStatus

文档评论(0)

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

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

版权声明书
用户编号:5311233133000002

1亿VIP精品文档

相关文档