Java - Boggle / Word矩阵求解器路径问题

时间:2015-12-20 17:02:16

标签: java algorithm recursion boggle

我正在创建一个应用程序,它将找到可以使用4x4网格(Boggle)上的相邻切片创建的所有单词。我已经到了可以输入一串字母的地方,算法将在最佳时间内找到所有可用的单词。但是,我不仅需要知道有效的单词,还要知道它们在方块上的位置。

这是主要的Game类。该算法递归地以一个字母开头,然后检查是否存在以该字母加上其邻居开头的任何单词。如果不存在单词,则会阻止路径,算法将移至下一个字母。如果存在带有该前缀的单词,请对该邻居执行相同的操作。

free

实际输出:

import java.io.IOException;
import java.util.ArrayList;

public class Game {
private final int boardSize = 4;
private BoardSquare[][] squares;
private ArrayList<String> validWords;
private static WordTree trie;
private static int counter = 0;
private DevRunner runner;

public Game(String letters) throws IOException{
    validWords = new ArrayList<String>();
    runner = new DevRunner();
    trie = new WordTree();
    squares = new BoardSquare[boardSize][boardSize];
    for (int y=0; y<boardSize; y++){
        for (int x=0; x<boardSize; x++){
            squares[x][y] = new BoardSquare(letters.charAt(y*boardSize + x), y*boardSize + x);
        }
    }
    for (int y=0; y<boardSize; y++){
        for (int x=0; x<boardSize; x++){
            for (int a=-1; a<2; a++){
                for (int b=-1; b<2; b++){
                    if (a == 0 && b == 0) continue;
                    if (x+b < 0 || y+a < 0) continue;
                    if (x+b > boardSize-1 || y+a > boardSize-1) continue;
                    squares[x][y].addNeighbor(squares[x+b][y+a]);
                }
            }
        }
    }
    getPossibleCombinations();
    System.out.println(counter + " words found.");
}

public void getPossibleCombinations(){
    for (int y=0; y<boardSize; y++){
        for (int x=0; x<boardSize; x++){
            doNeigh(squares[x][y], "", new ArrayList<Integer>());
        }
    }
}

public void doNeigh(BoardSquare square, String path, ArrayList<Integer> locations) {
    square.setIsActive(true);
    path += square.getData();
    locations.add(square.getPosition());
    if (trie.has(path) != 0){
        for (BoardSquare neighbor : square.getNeighbors()){
            if (!neighbor.getIsActive()){
                doNeigh(neighbor, path, locations);
                };
            }
        }
    if (trie.has(path) == 1 && !validWords.contains(path)){
        System.out.print(path + " is a word! (");
        validWords.add(path);
        for (int i : locations){
            System.out.print(i + " -> ");
        }
        System.out.print("\n");
        sendWord(path);
        counter++;
    }
    square.setIsActive(false);
}

public void sendWord(String s){

}

public static void main(String[] args){
    try {
        long t1 = System.currentTimeMillis();
        Game g = new Game("SIOZTRTEBAINERLA");
        long t2 = System.currentTimeMillis();
        System.out.println("The algorithm took " + Long.toString(t2-t1) + " milliseconds to complete.");
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

预期产出:

SITAR is a word! (0 -> 1 -> 2 -> 4 -> 5 -> 8 -> 9 -> 5 -> 2 -> 6 -> 8 -> 10 -> 6 -> 7 -> 11 -> 13 -> 14 -> 15 -> 
SIT is a word! (0 -> 1 -> 2 -> 4 -> 5 -> 8 -> 9 -> 5 -> 2 -> 6 -> 8 -> 10 -> 6 -> 7 -> 11 -> 13 -> 14 -> 15 -> 6 -> 8 -> 10 -> 12 -> 13 -> 8 -> 10 -> 5 -> 6 -> 7 -> 11 -> 14 -> 15 -> 12 -> 14 -> 14 -> 
SIR is a word! (0 -> 1 -> 2 -> 4 -> 5 -> 8 -> 9 -> 5 -> 2 -> 6 -> 8 -> 10 -> 6 -> 7 -> 11 -> 13 -> 14 -> 15 -> 6 -> 8 -> 10 -> 12 -> 13 -> 8 -> 10 -> 5 -> 6 -> 7 -> 11 -> 14 -> 15 -> 12 -> 14 -> 14 -> 5 -> 2 -> 3 -> 6 -> 7 -> 4 -> 6 -> 8 -> 9 -> 10 -> 6 -> 7 -> 9 -> 11 -> 6 -> 7 -> 14 -> 15 -> 13 -> 14 -> 15 -> 

我不明白为什么我可以使用doNeigh()方法并通过递归构建SITAR is a word! (0 -> 1 -> 4 -> 9 -> 5 -> SIT is a word! (0 -> 1 -> 4 -> SIR is a word! (0 -> 1 -> 5 -> ... ,但是当我尝试以相同的方式构建方块位置的arraylist时,它包括一堆不构成这个词的正方形。

感谢任何帮助,谢谢。

0 个答案:

没有答案