Java中的Farmer,W​​olf,Goat和Cabbage广度优先和深度优先搜索

时间:2014-03-11 20:58:52

标签: java algorithm depth-first-search breadth-first-search river-crossing-puzzle

所以,我开始解决这个问题,我必须把白菜,狼和山羊带到河对岸,而不是将白菜与山羊或狼和山羊一起放在同一侧。

我开始并对如何处理这个问题感到非常困惑。基本上我正在考虑添加一组顶点,这些顶点将导致正确的结果,并且只需让程序演示广度优先和深度优先搜索,而无需复杂的顶点生成过程。我是否正确地思考这个问题,还是有更好的方法?

这是我目前为止主要方法的代码。

package project3;

import java.util.*;
import java.io.*;


public class Project3 extends Network{

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    new Project3().run();
} //main method

public void run()
{
    String start ="fwgcR",
           finish = "Rfwgc";

    addVertex(start);
    addVertex("fwgRc");
    addVertex("fwcRg");
    addVertex(finish);


    //Breadth First iterator
    Iterator<String> itr = network.breadthFirstIterator (start);
        while (itr.hasNext())
            System.out.print (itr.next() + " ");

    //Depth First Iterator    
    itr = network.depthFirstIterator (start);
        while (itr.hasNext())
            System.out.print (itr.next() + " ");


    } // method run  
}

2 个答案:

答案 0 :(得分:3)

解决问题的常用方法是开发状态空间表示法。您似乎希望明确表示图中的所有状态和转换,但更常见的方法是设计状态表示,然后是从给定状态生成后继状态的进程。然后,搜索过程依赖于后继状态生成器来扩展当前状态并执行搜索。

我强烈建议使用状态生成函数,而不是从头开始构建完整的状态图。

在您的情况下,状态表示可能与每个对象(农民,狼,山羊和卷心菜)的当前河流一样简单。给定州的继承国是农民,可能是农民转换方面同一方面的目标之一。您可能希望过滤掉不允许的状态,作为后继生成函数的一部分。我不推荐使用字符串来表示状态,尽管它可以工作。一组四个布尔(每个代表,例如“河的右侧”)将更容易使用。

答案 1 :(得分:1)

我不知道您为什么要同时使用广度优先深度优先搜索,但是,可以使用其中任何一种来查找解决方案的正确步骤顺序。

使用字符串来表示图表中的节点是一个坏主意。从每个节点生成传出顶点并避免添加冗余节点将比必要的麻烦多得多。

您需要做的下一件事是定义一个类来表示图上的每个节点,并编写一个函数来查找相邻节点,过滤任何带有山羊和卷心菜或山羊的节点狼在河的另一边独自一人。