Ваша текущая функция поиска на самом деле ничего не делает. Я предполагаю, что это домашнее задание, поэтому нет бесплатного обеда;)
Самый простой подход - использовать две рекурсивные функции:
public boolean findStart(String word, int x, int y)
Это будет выполнять линейный поиск доски в поисках первого символа в word
. Если ваше текущее местоположение не совпадает, вы называете себя следующим набором координат. Когда он находит совпадение, он вызывает вашу вторую рекурсивную функцию, используя word
, текущее местоположение и новую пустую матрицу 4x4:
public boolean findWord(String word, int x, int y, int[][] visited)
Эта функция сначала проверяет, соответствует ли текущее местоположение первой букве в word
. Если это так, он отмечает текущее местоположение в visited
и проходит по всем смежным квадратам , за исключением отмеченных в visited
, вызывая себя с помощью word.substring(1)
и этих координат. Если у вас закончились буквы в word
, вы нашли его и вернули true. Обратите внимание, что если вы возвращаете false, вам нужно удалить текущее местоположение из visited
.
Вы можете сделать это с помощью одной функции, но, разделив логику, я лично думаю, что вам станет легче управлять в вашей голове. Единственным недостатком является то, что он делает дополнительное сравнение для каждой первой буквы в слове. Чтобы использовать одну функцию, вам необходимо отслеживать, в каком «режиме» вы работали, с помощью логического значения или счетчика глубины.
Редактировать: Ваше самое длинное слово должно быть только 16
. Boggle использует доску 4x4, и слово не может использовать одно и то же место дважды. Не то, чтобы это действительно имело значение, но это могло бы быть для назначения. Также обратите внимание, что я просто сделал это в своей голове и не знаю, что я понял это на 100% правильно - комментарии приветствуются.
Редактировать в ответ на комментарии:
Вот как будет выглядеть ваша итерация locate
с использованием описанного выше метода:
public boolean locate(String word)
{
for (int row = 0; row < 4; row++)
{
for (int col =0; col < 4; col++)
{
if (word.charAt(0) == letters[row][col])
{
boolean found = findWord(word, row, col, new boolean[4][4]);
if (found)
return true;
}
}
}
return false;
}
То же самое рекурсивно выглядит следующим образом, что должно помочь:
public boolean findStart(String word, int x, int y)
{
boolean found = false;
if (word.charAt(0) == letters[x][y])
{
found = findWord(word, x, y, new boolean[4][4]);
}
if (found)
return true;
else
{
y++;
if (y > 3)
{
y = 0;
x++;
}
if (x > 3)
return false;
}
return findStart(word, x, y);
}
Итак, вот findWord()
и вспомогательный метод getAdjoining()
, чтобы показать вам, как все это работает. Обратите внимание, что я изменил массив visited
на boolean
только потому, что это имело смысл:
public boolean findWord(String word, int x, int y, boolean[][] visited)
{
if (letters[x][y] == word.charAt(0))
{
if (word.length() == 1) // this is the last character in the word
return true;
else
{
visited[x][y] = true;
List<Point> adjoining = getAdjoining(x,y,visited);
for (Point p : adjoining)
{
boolean found = findWord(word.substring(1), p.x, p.y, visited);
if (found)
return true;
}
visited[x][y] = false;
}
}
return false;
}
public List<Point> getAdjoining(int x, int y, boolean[][] visited)
{
List<Point> adjoining = new LinkedList<Point>();
for (int x2 = x-1; x2 <= x+1; x2++)
{
for (int y2 = y-1; y2 <= y+1; y2++)
{
if (x2 < 0 || x2 > 3 ||
y2 < 0 || y2 > 3 ||
(x2 == x && y2 == y) ||
visited[x2][y2])
{
continue;
}
adjoining.add(new Point(x2,y2));
}
}
return adjoining;
}
Так что теперь, после того, как вы получите ввод от пользователя в виде String
(слово), вы просто позвоните:
boolean isOnBoard = findStart(word,0,0);
Первоначально я делал это в своей голове, затем просто пошел по этому пути, чтобы попытаться показать вам, как это работает. Если бы я на самом деле реализовал это, я бы сделал некоторые вещи по-другому (в основном, исключив двойное сравнение первой буквы в слове, возможно, путем объединения двух в один метод, хотя вы можете сделать это, переставив логику в текущих методах), но приведенный выше код работает и должен помочь вам лучше понять рекурсивный поиск.