当前位置:   article > 正文

农夫过河问题的求解_一个农夫带着一只狼、一只羊和一棵白菜,身处河的南岸。他要把这些东西全部运到北

一个农夫带着一只狼、一只羊和一棵白菜,身处河的南岸。他要把这些东西全部运到北
一、实验目的
1、问题描述
 一个农夫带着一只狼、一只羊和一棵白菜,身处河的南岸。他要把这些东西全部运到北岸。他面前只有一条小船,船只能容下他和一件物品,另外只有农夫 才能撑船。如果农夫在场,则狼不能吃羊,羊不能吃白菜,否则狼会吃羊,羊会 吃白菜,所以农夫不能留下羊和白菜自己离开,也不能留下狼和羊自己离开,而狼不吃白菜。请求出农夫将所有的东西运过河的方案。
2、实现提示
求解这个问题的简单方法是一步一步进行试探,每一步搜索所有可能的选择 ,对前一步合适的选择后再考虑下一步的各种方案。要模拟农夫过河问题,首先 需要对问题中的每个角色的位置进行描述。可用4位二进制数顺序分别表示农夫、 狼、白菜和羊的位置。用0表在南岸,1表示在北岸。例如,整数5 (0101)表示农 夫和白菜在南岸,而狼和羊在北岸。     现在问题变成:从初始的状态二进制0000(全部在河的南岸)出发,寻找一种 全部由安全状态构成的状态序列,它以二进制1111(全部到达河的北岸)为最终目 标。总状态共16种(0000到1111),(或者看成16个顶点的有向图)可采用广度优先或深度优先的搜索策略---得到从0000到1111的安全路径。
以广度优先为例:整数队列---逐层存放下一步可能的安全状态;Visited[16]数组标记该状态是否已访问过,若访问过,则记录前驱状态值---安全路径。
最终的过河方案应用汉字显示出每一步的两岸状态。
二、算法难点
选择用图来做此问题的逻辑结构,判断两个状态之间是否可以相互转换,即模拟过河情景。
三、解决思路及算法

要模拟农夫过河问题,首先需要选择一个对问题中每个角色的位置进行描述的方法。一个很方便的办法是用四位二进制数顺序分别表示农夫、狼、白菜和羊的位置。例如用0表示农夫或者某东西在河的南岸,1表示在河的北岸。因此可以列举出16种情景,其中有6种情形是不安全的。从初始状态二进制0000(全部在河的南岸) 出发,寻找一种全部由安全状态构成的状态序列,它以二进制1111(全部到达河的北岸) 为最终目标,并且在序列中的每一个状态都可以从前一状态通过农夫(可以带一样东西)划船过河的动作到达。


实现DFS的前提是建立图或邻接表进行存储。我们选择用邻接表存储,将问题转化成如何建立邻接表的节点并构建相邻节点。邻接表的每个元素表示一个可以安全到达的中间状态。另外还需要一个数据结构记录已被访问过的各个状态,以及已被发现的能够到达当前这个状态的路径。 
首先建立结点,包含农夫、狼、羊、白菜四个属性,最初状态均是0。设visited数组对已访问的顶点进行标记(图的遍历)ÿ

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/378606
推荐阅读
相关标签
  

闽ICP备14008679号