0

ボーグル ソルバーを実装しようとしています。

私の基本的なアイデアは、単語がボード上にあるかどうかを確認するメソッドを作成することでした。次に、ボード上にないcharで始まる単語を削除して辞書をトリムし、そのメソッドを辞書セットのすべての単語に適用して、ソリューションセットを取得します。

このソリューションがどれほど効率的かは完全にはわかりません.. O(n)(辞書セットのサイズに比例)で実行されるだけだと確信しています-これはより大きなボード(5x5 - 7x7)でうまくいくでしょう

私の現在の方法(訪問した方法を修正できればうまくいくはずです):

private Tile findFirstTile(String word) {
    word = word.toUpperCase();
    Tile first = null;
    boolean found = false;
    for (Tile tile : tiles) {
        if (tile.getChar() == word.charAt(0)) {
            first = tile;
            found = true;
        }
    }
    if (found) {
        System.out.println("Found the tile!!");
        return first;
    }
    else return null;
}


public boolean findWordOnBoard(String word, Tile tile, int depth, HashSet<Integer> visited) {
    System.out.println("depth is " + String.valueOf(depth) + " right meow.");
    if (depth == word.length()) return true; // base case - breaks recursion (on board)
    else {
        word = word.toUpperCase();
        if (tile == null) return false;
        HashSet<Integer> neighbors = map.get(tile.getPlace());
        for (int n : neighbors) {
            if ((tiles[n-1].getChar() == word.charAt(depth)) && (!visited.contains(n))) {
                visited.add(n);
                System.out.println("found " + tile.getChar() + " at " + n);
                if (depth == word.length()) return true; // it shouldn't but oh well it's just here
                findWordOnBoard(word, tiles[n-1], depth +1, visited);
            } 
        }

        System.out.println("only supposed to be here if it's ACTUALLY not on board");
        return false; //will only get here if it doesn't find a new word
    }
}

再帰を正しく実装しているかどうかはわかりません..今は単語が見つかりませんが、うまくいくように思えます..? 訪問したセットを正しく処理しているかどうか (各深度で訪問したタイルを追跡している場合) が特に心配ですが、それ以外の場合は短い単語を見つけることができるはずなので、それだけの問題ではないことはわかっています。 ..

R L O S
E E A P
M S T R
E A T S

また、「findFirstTile」メソッドは、その文字で始まる最後のタイルの単語の検索のみを開始することに気付きました...そのため、ボード上にその文字が複数回出現する場合、すべてを検索しない可能性があります。

これは、私の Tile オブジェクトのコンストラクタでもあります。

  public Tile (char letter, int place){ // NOTE: the char MUST BE capital
    this.letter = letter;
    this.place = place;
    try {
        img = ImageIO.read(new File("tile"+letter+".png"));
    } catch (IOException e) {
    }

私が参照する Tile 配列 (タイル) も、すべてのタイルを順番に並べただけの配列なので、基本的に私のボードでは次のようになります。

tiles[0]  tiles[1]  tiles[2]  tiles[3]
tiles[4]  tiles[5]  tiles[6]  tiles[7]
tiles[8]  tiles[9]  tiles[10] tiles[11]
tiles[12] tiles[13] tiles[14] tiles[15]

「場所」(Tileコンストラクターから)はちょうど

1  2  3  4
5  6  7  8
9  10 11 12
13 14 15 16

getNeighbors() と getChar() と getPlace() メソッドをチェックしましたが、それらはすべて意図したとおりに機能します。

4

1 に答える 1