Получить положение слова в Боггле

Я решаю проблему 4 *4 в Android, используя этот фрагмент кода. Это работает хорошо, но я пытаюсь найти положение найденного слова в нем.

| A | C | E | X |
-----------------
| X | X | X | X |
-----------------
| X | X | X | X |
-----------------
| X | B | A | R |

Допустим, я пытаюсь найти позицию ACE на основе индекса 0. Это [0, 1, 2].

Или БАР, это [13, 14, 15]

Как мне этого добиться? Я попробовал несколько реализаций, но они испортились, поэтому я публикую код без них.

public class Boggle {

    private NavigableSet<String> dict___ = new TreeSet<>();
    ArrayList<Word> foundWords = new ArrayList<>();

    /* helpers */
    int N = 4;
    char[][] board = new char[N][N];


    /* context obj*/
    private final Context ctx;

    public Boggle(Context ctx) {
        this.ctx = ctx;
        initFile();
    }


    public ArrayList<Word> startSolving(String str) {
        initPuzzle(str);

        Stack<Point> visitedLetters = new Stack<>();


        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                findWordRecursive(i, j, new Word("", null), visitedLetters);
            }
        }

        Log("foundWords = " + foundWords.size());
        Log("=============================");

        return foundWords;
    }

    private void findWordRecursive(int i, int j, Word prefix, Stack<Point> visitedLetters) {

        Point currentLocation = new Point(i, j);
        visitedLetters.push(currentLocation);

        String possibleWord = prefix.getWord() + this.board[i][j];

        if (dict___.contains(possibleWord)) {
            if(!isFoundWordsContains(possibleWord)) {
                foundWords.add(
                        new Word(
                                possibleWord,
                                null)
                );
            }
        }

        NavigableSet<String> child__ = findChildWords(possibleWord);

        if (!child__.isEmpty()) {
            for (int x = Math.max(0, i - 1); x < Math.min(i + 2, 4); x++) {
                for (int y = Math.max(0, j - 1); y < Math.min(j + 2, 4); y++) {
                    if (!visitedLetters.contains(new Point(x,y))) {
                        findWordRecursive(x, y, new Word(possibleWord, null), visitedLetters);
                    }
                }
            }
        }

        visitedLetters.pop();
    }

    private void initFile() {

        Log("=============================");
        Log("init starting");

        //fill dict___ array with words from a TXT file.

        Log("init finished")

    }


    void initPuzzle(String letters) {
        letters = letters.toLowerCase(new Locale("tr", "TR"));
        int in = 0;
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {

                board[i][j] = letters.charAt(in);
                in++;
            }
        }
        Log("board letters inited");
    }

    void Log(String e){
         Log.wtf("___Boggle___", e);
    }

    NavigableSet<String> findChildWords(String prefix){
        prefix = prefix.toLowerCase(new Locale("tr", "TR"));
        return dict___.subSet(prefix, false, prefix+"zzzzzzzzzzzzzzz", false);
    }

    boolean isFoundWordsContains(String word) {
        boolean yeah = false;

        for (int i = 0; i < foundWords.size(); i++) {
            if(word.equals(foundWords.get(i).getWord())) {
                yeah = true;
                break;
            }
        }

        return yeah;
    }
}

Слово класс:

public class Word {

    private String word;
    private ArrayList<Integer> position;

    public Word(String word, ArrayList<Integer> position) {
        this.word = word;
        this.position = position;
    }

    public String getWord() {
        return word;
    }

}

1 ответ

Решение

Я думаю, что ваша проблема из-за prefix = prefix.toLowerCase(new Locale("tr", "TR"));

Таким образом, чтобы ваш код работал, вам может потребоваться проверить этот шаг:

  • все String в dict___ Должен быть в нижнем регистре.
  • dict___ должно содержать подмножество слов (для "туза" должно быть не менее "а", "ac", "туз")
  • в findWordRecursive замещать String possibleWord = prefix.getWord() + this.board[i][j]; от
    String possibleWord = prefix.getWord() + this.board[i][j]; possibleWord = possibleWord.toLowerCase();
    Обновить
    Чтобы найти позицию, вы можете попробовать это:

  • в startSolvingиспользовать findWordRecursive(i, j, new Word("", new ArrayList<Integer>()), visitedLetters);

  • в findWordRecursive, добавьте проход currentPosition

        int curPos = i * N + j;
        if (dict___.contains(possibleWord)) {
            if(!isFoundWordsContains(possibleWord)) {
                // add current position to the word
                ArrayList<Integer> posList = new ArrayList<Integer>();
                posList.addAll(prefix.position);
                posList.add(curPos);
                foundWords.add(
                        new Word(
                                possibleWord,
                                posList)
                );
            }
        }
    
        NavigableSet<String> child__ = findChildWords(possibleWord);
    
        if (!child__.isEmpty()) {
            for (int x = Math.max(0, i - 1); x < Math.min(i + 2, 4); x++) {
                for (int y = Math.max(0, j - 1); y < Math.min(j + 2, 4); y++) {
                    if (!visitedLetters.contains(new Point(x,y))) {
                        // add current before find new word
                        ArrayList<Integer> posList = new ArrayList<Integer>(prefix.position);
                        posList.addAll(prefix.position);
                        posList.add(curPos);
    
                        findWordRecursive(x, y, new Word(possibleWord, posList), visitedLetters);
                    }
                }
            }
        }
    
Другие вопросы по тегам