簡體   English   中英

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

[英]Farmer, Wolf, Goat and Cabbage Breadth-first and Depth-first Search in Java

所以,我開始出現這個問題,我必須把白菜,狼和山羊帶到河對岸,而不要將卷心菜與山羊或狼和山羊一起放在同一側。

我開始並對如何處理這個問題感到非常困惑。 基本上我正在考慮添加一組頂點,這些頂點將導致正確的結果,並且只需讓程序演示廣度優先和深度優先搜索,而無需復雜的頂點生成過程。 我是否正確地思考這個問題,還是有更好的方法?

這是我目前為止主要方法的代碼。

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  
}

解決問題的常用方法是開發狀態空間表示。 您似乎希望明確表示圖中的所有狀態和轉換,但更常見的方法是設計狀態表示,然后是從給定狀態生成后繼狀態的進程。 然后,搜索過程依賴於后繼狀態生成器來擴展當前狀態並執行搜索。

我強烈建議使用狀態生成函數,而不是從一開始就構建完整的狀態圖。

在您的情況下,狀態表示可能與每個對象(農民,狼,山羊和卷心菜)的當前河流一樣簡單。 給定州的繼承國是農民,可能是農民轉換方面同一方面的目標之一。 您可能希望過濾掉不允許的狀態,作為后繼生成函數的一部分。 我不推薦使用字符串來表示狀態,盡管它可以工作。 一組四個布爾(每個代表,例如,“河的右側”)將更容易使用。

我不知道你為什么要同時使用廣度優先深度優先搜索,但是,可以使用其中任何一個來找到解決方案的正確步驟順序。

使用字符串來表示圖表中的節點是個壞主意。 從每個節點生成傳出頂點並避免添加冗余節點將比不必要的麻煩多得多。

接下來你需要做的是定義一個類來表示圖上的每個節點,並編寫一個函數來查找相鄰的節點, 過濾掉山羊和卷心菜或山羊和狼在河的同一側的任何節點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM