这是我正在进行的数据结构课程的一个项目,所以我不想提供编码答案,而是希望您输入我是否正确地思考这个问题,或者我是否遗漏了某些内容。你们中的许多人都听说过这个谜题,但万一你们还没有,这就是:
一位农民带着他的财产在河的南岸:山羊,狼和非常大的卷心菜。农夫想要带着他所有的财产到达河的北岸。这条河太深,太宽,不能穿过。但是,有一艘小船可用。船很小,农民一次只能拿走他的一个物品。重要的是要注意其他两个条件。
- 如果山羊和狼独自留在火星车的同一侧,那么狼就会吃掉山羊。
- 如果将山羊和卷心菜放在同一侧,山羊会吃白菜。
醇>
该项目要求我们创建一个图表数据结构,以帮助农民决定如何将他的财产转移到河的另一边。
我目前的想法是,我将有一个Vertex
课程:
public class Vertex {
private enum Element{ FARMER, SHEEP, WOLF, CABBAGE }
private Element type;
private List<Edge> neighbors;
public Vertex(Element e){
type = e;
}
public List getNeighbors(){
return this.neighbors;
}
public void AddEdge(Vertex destination, int depth){
neighbors.add(new Edge(destination, depth));
destination.neighbors.add(new Edge(this, depth));
}
private static class Edge {
public Vertex destination;
public int depth;
public Edge(Vertex destination, int depth){
this.destination = destination;
this.depth = depth;
}
}
}
我还想创建一个Graph
类,其中包含顶点&amp;的一个collection
(HashMap,TreeMap或其他类型的数据结构)。边作为一个字段。它还包含我的Bank
类的两个对象的字段,以表示河流的南侧和北侧。
正如您在Vertex
课程中看到的,我创建了一个名为Element
的枚举,其中包含FARMER, SHEEP, WOLF, CABBAGE
。在阅读了关于Map实现的JavaDoc之后,我倾向于使用EnumMap
作为我的Map类型。最后,我需要在BreadFirst搜索和DepthFirst搜索中迭代这些数据,但我无法想到为什么一个Map实现比另一个更好的原因。
我只是从阅读JavaDoc而不是在课堂上了解到EnumMap,所以我想确保我不会错过任何会让这个想法变得糟糕的重要信息...
所以我的问题是:在此上下文中使用EnumMap
是否有意义,或者不同的Map实现更有意义?
如果您需要更多说明或背景信息,请告知我们。
答案 0 :(得分:0)
在我看来,银行状态应该进入顶点,边缘类型应该是四种可能性之一(三种可用动物或自己)。一个哈希集对于检测图中的周期很有用,但这显然需要为Vertex类提供适当的equals和hashCode方法。
Graph类不需要维护边集合。它只需要引用初始Vertex以及任意数量的实用方法。
对于EnumMap,每个Vertex都可以使用它来将边存储到下一个Vertex。