vc++算法,狼羊白菜问题

vc++算法,狼羊白菜问题,第1张

1 先把羊从左岸带到右岸

2 当农夫回到左岸,带着白菜过去

3 当农夫把白菜带到右岸后,同时把羊带回左岸(因为这时羊会吃白菜必须带回)

4 当农夫把羊带回左岸后,同时把狼带到右岸(同上理带到右岸后狼不吃白菜)

5 当农夫把狼带到右岸后,回到左岸,把羊再带过来

设目的地为南 另一端为北

先把羊从北岸运到南岸,此时北岸剩狼和草,

然后人自行驾船回北岸,将草运装船运到南岸

到南岸之后将草卸下,载上羊返回北岸

到北岸卸下羊 装上狼,将狼载上运到南岸

到南岸卸下,此时南岸剩狼和草

空载驾船到北岸 装上羊 返回南岸

用0表示在左岸,1表示在右岸

顶点序号的二进制码的0位表示农夫,1位表示狼,2位表示羊,3位表示菜

那么,总共可能有16个顶点0-15顶点0表示全在左岸,顶点15表示全在右岸

当然有些顶点是不允许存在的,比如顶点3,表示农夫和狼在右岸,羊和菜在左岸,羊会吃掉菜你要把所有这类的顶点去掉

在剩下的顶点中,你要找出所有的可能的边比如顶点5表示农夫和羊在右,狼和菜在左,顶点4表示羊在右,那么就存在顶点5到顶点4的有向边

至此,图已构造完毕,问题就转换成找到一条从顶点0到顶点15的合理路径

解:该问题可以使用图论中的最短路算法进行求解。

我们可以用四维向量来表示状态,其中第一分量表示人,第二分量表示狼,第三分量表

示羊,第四分量表示蔬菜;当人或物在此岸时相应分量取1,在对岸时则取0。

根据题意,人不在场时,狼要吃羊,羊要吃菜,因此,人不在场时,不能将狼与羊,羊

与蔬菜留在河的任一岸。例如,状态(0,1,1,0)表示人和菜在对岸,而狼和羊在此岸,

这时人不在场的情况下狼要吃羊,因此,这个状态是不可行的。

我们通过穷举法将所有可行的状态列举出来,可行的状态有

(1,1,1,1),(1,1,1,0),(1,1,0,1),(1,0,1,1),(1,0,1,0)

(0,1,0,1),(0,1,0,0),(0,0,1,0),(0,0,0,1),(0,0,0,0)

可行状态共有十种。每一次的渡河行为改变现有的状态。现构造赋权图G = (V, E,W) ,

其中集合V 中的顶点表示十个可行状态,当且仅当对应的两个可行状态之间存在一个可行

转移时两顶点之间才有线连接,并且对应的权重取为1,当两个顶点之间不存在可行转移时,

可以把相应的权重取为∞ 。

因此问题变为在图G 中寻找一条由初始状态(1,1,1,1)出发,经最小次数转移达到

最终状态(0,0,0,0)的转移过程,即求从状态(1,1,1,1)到状态(0,0,0,0)的

最短路径。这就将问题转化成了图论中的最短路问题。

下面首先计算邻接矩阵,由于摆渡一次就改变现有的状态,为此再引入一个四维状态转

移向量,用它来反映摆渡情况。用1 表示过河,0 表示未过河。例如,(1,1,0,0)表示

人带狗过河。状态转移只有四种情况,用如下的向量表示。

(1,0,0,0),(1,1,0,0),(1,0,1,0),(1,0,0,1)

现在规定状态向量与转移向量之间的运算为

0 + 0 =1,1+ 0 =1 , 0 +1 =1 ,1+1 =1

通过上面的定义,如果某一个可行状态加上转移向量得到的新向量还属于可行状态,则这两

个可行状态对应的顶点之间就存在一条边。用计算机编程时,我们可以利用普通的向量运算

与模2 运算实现。

源程序联系我 我发给你

以上就是关于vc++算法,狼羊白菜问题全部的内容,包括:vc++算法,狼羊白菜问题、数学建模,人狼羊草过河问题、农夫狼羊过河图论等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10171182.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存