哪种地图实施最适合River Crossing拼图?

时间:2017-03-07 05:05:52

标签: java dictionary graph

这是我正在进行的数据结构课程的一个项目,所以我不想提供编码答案,而是希望您输入我是否正确地思考这个问题,或者我是否遗漏了某些内容。你们中的许多人都听说过这个谜题,但万一你们还没有,这就是:

  一位农民带着他的财产在河的南岸:山羊,狼和非常大的卷心菜。农夫想要带着他所有的财产到达河的北岸。这条河太深,太宽,不能穿过。但是,有一艘小船可用。船很小,农民一次只能拿走他的一个物品。重要的是要注意其他两个条件。

     
      
  1. 如果山羊和狼独自留在火星车的同一侧,那么狼就会吃掉山羊。
  2.   
  3. 如果将山羊和卷心菜放在同一侧,山羊会吃白菜。
  4.   

该项目要求我们创建一个图表数据结构,以帮助农民决定如何将他的财产转移到河的另一边。

我目前的想法是,我将有一个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实现更有意义?

如果您需要更多说明或背景信息,请告知我们。

1 个答案:

答案 0 :(得分:0)

在我看来,银行状态应该进入顶点,边缘类型应该是四种可能性之一(三种可用动物或自己)。一个哈希集对于检测图中的周期很有用,但这显然需要为Vertex类提供适当的equals和hashCode方法。

Graph类不需要维护边集合。它只需要引用初始Vertex以及任意数量的实用方法。

对于EnumMap,每个Vertex都可以使用它来将边存储到下一个Vertex。