▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼

最新链接


题目要求

问题描述:三只牛三只虎过河,船最多只能容纳两只动物,且船在往返途中不能为空。在任一岸边,若牛的数量少于虎的数量,则牛就会被吃掉。为了使动物全部过河且使动物无损失,请制定合理的渡河方案。

解决方案

这也是一个经典的渡河问题了,由此衍化出的版本有商人仆人(随从)过河,农夫妖怪过河,传教士野人过河...除了角色有变化,内容本质上是一样的。

假设原来的动物和船都在A岸,现在想渡河到对面的B岸。考虑牛虎数量和船的位置,可以将本题中的所有可能出现的情形描述为静态属性动态属性。静态属性就是船停靠在A岸或者B岸时,A岸牛、虎的数量(A岸数目一定时,B岸也一定,所以只需考虑一边就行),动态属性就是船在运行中,A按或者B岸牛、虎的数量。

进一步考虑,只要知道了相邻的两个静态属性,也就知道了发生在其中的动态属性。比如开始船在A岸,A岸有牛、虎各3只,下一个状态为船在B岸,A岸有牛虎各两只,那它们之间的动态属性一定是船由A到B,且运送了一牛一虎过去。所以在这里,我们只需要确定每一步对应的静态属性,在编程中,将其描述为状态。对于岸边的牛或者虎的数量,只有0到3这4个取值,对于船的停靠位置,只有A岸和B岸两种情形,这样一来,就有了4*4*2=32种状态。在这32种状态中,有些状态会引起牛吃虎,这必须被排除掉。

到这里,制定渡河方案的问题就转换为在这32个状态中探寻合理“状态路径”的问题。我们从初始状态——A岸牛虎各3只,船在A岸这个状态出发,不断判断遇到的下一个状态是否合理。如果下一个状态合理,就将其加入到“状态路径”当中,并留下访问标记(防止重复添加,形成环路),否则,跳过此状态。在不断向前探寻的过程中,如果遇到一个标记为已访问的状态,说明该状态已加入路径,需要探寻下一种可能。如果遇到了结束状态——A岸牛虎为0,船在B岸,则说明找到了一条完整的“状态路径”,这时需要打印这条路径,并清除当前状态的访问标记,并退出上一个状态,继续寻找下一种可能性。

在具体编程中,可以利用来存储初始状态到结束状态的所有状态,目的是为了在遇到不符合题意的状态时,可以原路返回,便于回溯。由于在推进过程中,每个状态都是基于对岸边牛虎数量和船的停靠位置的判断,所以,考虑用递归会更容易。但值得注意的是,这里的递归并不像斐波那契数列那样不断衍生出先决条件,而是更类似于“尾递归”,即递归的外壳迭代的内心

戳这☛:尾递归=递归+迭代?

源码示例

结果展示

小结

一个经典的过河问题,本质就是在各状态之间寻求符合题意的状态路径,在有多条路径的情形下,需要使用栈保存之前的各个状态,以便在遇到不符合条件的状态时可以回溯。这种回溯思想在迷宫寻路问题和八皇后问题中都有体现。可以说是一母同胞,属于同一类型的问题。

▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

过河问题(牛虎过河、商人仆人过河、农夫妖怪过河、传教士野人过河)(第2届第2题)相关推荐

  1. python深度优先搜索传教士和野人_ai1 带回溯的深度优先策略:解决经典野人传教士过河问题的求解:三个修道士和三个野人过河 - 下载 - 搜珍网...

    带回溯的深度优先策略:解决经典野人传教士过河问题的求解:三个修道士和三个野人过河,船一次最多只能载两个人,在任何时候修道士的人数不能少于野人人数,否则野人会吃掉修道士.找出六个人顺利过河的所有方案. ...

  2. 基于visual Studio2013解决C语言竞赛题之1089牛虎过河

        题目 解决代码及点评 /************************************************************************/ /* ...

  3. 商人过河c语言实验报告,商人过河C语言程序编程

    <商人过河C语言程序编程>由会员分享,可在线阅读,更多相关<商人过河C语言程序编程(12页珍藏版)>请在人人文库网上搜索. 1.include #include #includ ...

  4. 人工智能--野人过河

    课程简介 人工智能(Artificial Intelligence),英文缩写为AI.它是研究.开发用于模拟.延伸和扩展人的智能的理论.方法.技术及应用系统的一门新的技术科学.人工智能的定义可以分为两 ...

  5. 野人与传教士过河java_传教士和野人过河(经典MC问题)

    这个问题本来是<人工智能技术导论>第三章的课后题,今天上午考试正巧考到了这道题,要我们画状态转换图,我之前思考过一点,所以写出的状态表示应该没有问题,但这些状态太多了.......,十来种 ...

  6. 人工智能基础之美女和野人过河问题

    一.引言 AI(Artificial Intelligence)人工智能,可以说是最近比较火热一个词.就像曾经的互联网概念一样,任何一个项目只要和AI搭上边,就似乎显得非常高大上.AI是一个领域,是一 ...

  7. 传教士与野人过河问题 人工智能实验算法

    问题描述 有 N 个传教士和 N 个野人来到河边渡河,河岸有一条船,每次至多可供 k 人乘渡.问:传教士为了安全起见,应如何规划摆渡方案,使得任何时刻, 河两岸以及船上的野人数目总是不超过传教士的数目 ...

  8. 人工智能实践作业-修道士和野人过河问题

    人工智能实践作业-修道士和野人过河问题: 用编程语言编写和调试一个基于深度优先搜索法的解决"野人与传教士过河"问题的程序.目的是学会运用知识表示方法和搜索策略求解一些考验智力的简单 ...

  9. 修道士和野人过河问题 A*算法 人工智能

    /** * 2014-08-25 by Liy * 修道士和野人过河问题,一共有3个修道士和3个野人,1条船 * 1.船最多可乘坐2人 * 2.两岸边 野人的数量不能多于修道士的数量,否则修道士会被吃 ...

最新文章

  1. js里的null 与undefined
  2. 第八节:语法总结(2)(匿名类、匿名方法、扩展方法)
  3. HBase 1.3(NOSQL) 发布,性能大幅提升
  4. BZOJ——1607: [Usaco2008 Dec]Patting Heads 轻拍牛头
  5. win10怎么打开计算机树形,win10系统中显示树形目录文件夹的两种方法
  6. 怪物猎人世界pc服务器在哪个文件夹,关于PC怪物猎人世界拆包文件的一些问题...
  7. 魔鬼训练Day2作业
  8. MQTT如何快速助你产品化
  9. Tobii Eye Tracker 4C 入门教程(一)
  10. 英语常见的固定搭配有哪些
  11. 软件测试常见分辨率测试,兼容测试:常见的显示器分辨率
  12. C语言规定 程序中各函数之间_,C语言规定,程序中各函数之间________。 答案:既允许直接递归调用也允许间接递归调用...
  13. C++ 类中的static成员的使用及单例设计示例
  14. Python几种开发工具介绍
  15. CodeBlocks常见编译错误(to be updated)
  16. 西电李航 操作系统课程笔记 day10 IO hardware principles
  17. WEB HTML 二级菜单 折叠展开菜单
  18. 选煤过程中 灰分、硫分、水分的介绍
  19. [人工智能-深度学习-1]:主流深度学习框架比较、排名
  20. 狗比男人好的21个理由

热门文章

  1. 你真的知道什么是项目吗?项目的基本概念
  2. JaroDistance、JaroWinklerDistance的Java实现
  3. 模拟CMOS集成电路设计 学习笔记(二)
  4. java学习笔记——spring框架 常遇到问题链接搜集
  5. linux java -cp 环境变量
  6. CarSim与Simulink联合仿真——ABS
  7. 在职场上奋战不懈的各位12把健康金钥匙
  8. 中关村GHOST XP SP3纯净装机自选CD版2011V3(NTFS)
  9. 时代不同了,CPU至少要4核了
  10. codeforces 1244 C 数论