📜  拼图 |农民、山羊、狼和卷心菜

📅  最后修改于: 2022-05-13 01:57:25.753000             🧑  作者: Mango

拼图 |农民、山羊、狼和卷心菜

有一个农民想过河,但他并不孤单。他还有一只山羊、一只狼和一棵卷心菜。只有一艘船可以支撑农民和山羊、狼或卷心菜。所以一次,船只能有两个物体(农民和另一个)。
但问题是,如果让山羊和狼单独呆着(在船上或岸上),狼会吃掉山羊。同样,如果山羊和卷心菜被单独留下,那么山羊会吃卷心菜。农夫想带着他所有的三样东西过河:山羊、狼和卷心菜。
他应该使用什么策略来做到这一点?

解决方案1:将狼带到另一边,将山羊和卷心菜放在一起。带走白菜也会使狼和山羊孤单。因此,农夫会先在另一边带走山羊,然后独自返回。我们的一侧有农民、狼和卷心菜,另一侧有山羊。
现在,他会带着狼,把狼丢在另一边,带着山羊回来。所以现在一方面,我们有农民、卷心菜和山羊,另一方面,我们有一只狼。
现在,他带着白菜独自回来了。所以现在的场景是:农民,一边是山羊,另一边是狼,白菜。
现在,他终于带着山羊过河了,因此成功地带走了他所有的东西。

参考: https://www.bhavinionline.com/2013/10/river-crossing-puzzle-farmer-wants-to-cross-with-wolf-goat-and-cabbage/

解决方案2:这个问题可以使用图论来解决。
考虑 2 个状态:初始 (A) 和最终 (B)。
起初,河的右边什么都没有,山羊、白菜和狼在左边。在最终状态下,所有三个(山羊、卷心菜和狼)都将位于右侧。我们如何从状态 A 到达状态 B?右岸可以有山羊(G)、卷心菜(C)、狼(W)的这些组合。
-> 0、G、W、C、GW、GC、WC、GWC
0 代表初始状态(A),GWC 代表最终状态(B)。我们可以将此问题建模为无向加权图。图中每条边的权重为 1 或无穷大。

这个图可以用来表示我们的问题。



现在,不能遍历所有具有无限权重的路径,否则将违反问题的约束。因此,我们必须使用权重为 1 的路径从 A 移动到 B,并且我们可以使用 Dijkstra 的最短路径算法找到一条有效路径。

解释 :
很明显,最初,船夫只能带着山羊。因此,从顶点 0 到顶点 G,我们将权重设置为 1。在其他情况下,(0 到 W,0 到 C)有人会被吃掉。因此,我们将这些权重设置为无穷大。
使用类似的直觉很容易设计出解决方案。