农夫过河
1、题目要求
1.1设计目的
掌握广度优先搜索策略,并用队列求解农夫过河问题。
1.2设计内容
一个农夫带着一只狼、一只羊和一棵白菜,身处和的南岸,他要把这些东西全部运到北岸,遗憾的是他只有一只小船,小船只能容下他和一件物品。这里只能是农夫来乘船,同时,狼会吃羊,羊会吃白菜,农夫怎样才能把所有的东西安全运过河呢?
1.3设计要求
设计物品位置的表示方法和安全判断算法;采用广度优先策略设计可行的过河算法;要求输出所有的可行方案。
2.问题分析
该问题是一个含有三个结点的图的问题,但这样做,我们没法来表示这个过程。在这个问题的解决过程中,农夫需要多次架船往返于两岸之间,每次可以带一样东西或者自己单独过河,每一次过河都会使农夫、狼、羊和菜所处的位置发生变化。如果我们用一个四元组(Farmer,Wolf,Sheep,Veget)表示当前农夫、狼、羊和菜所处的位置,其中每个元素可以是0或1,0表示在左岸,1表示在右岸。这样,对这四个元素的不同取值可以构成16种不同的状态,初始时的状态则为(0,0,0,0),最终要达到的目标为(1,1,1,1)。状态之间的转换可以有下面四种情况:
(1)农夫不带任何东西过河,可表示为:
(Farmer,Wolf,Sheep,Veget) (!Farmer,Wolf,Sheep,Veget)我们需要把农夫的状态取反。
(2)当农夫带狼过河时,即当Farmer = = Wolf时:
(Farmer,Wolf,Sheep,Veget) (!Farmer,!Wolf,Sheep,Veget)我们要把农夫和狼的状态全部取反。
(3)当农夫带羊过河,即当Farmer = = Sheep时:
(Farmer,Wolf,Sheep,Veget) (!Farmer,Wolf,!Sheep,Veget)我们要把农夫和羊的状态进行取反。
(4)当农夫带菜过河时,即当Farmer==Veget时:
(Farmer,Wolf,Sheep,Veget) (!Farmer,Wolf,Sheep,!Veget)我们要把农夫和白菜的状态取反。
然后在这16种状态中,有些状态是不安全的,是不允许出现的,如(0,1,1,0)表示农夫和菜在南岸,而狼和羊在北岸,这样狼会吃掉羊。我们需要从16种状态中删去这些不安全状态,将剩余的安全状态之间根据上面的转换关系连接起来,就得到如下图所示的两图。并且我们在这采用邻接矩阵的方法来实现这个问题。下面将会给出解题过程的一些细节。图1 为筛选后剩余的安全结点及其下标号的表,图2是 农夫、狼、羊和菜安全转移到对岸的过程及其它们的状态图。
运行结果
过程较多,在此不一一展示,如需要源码和设计文档,欢迎关注和私信!!