Итеративная глубина, первый поиск для поиска строки (2D Array)
Я пытаюсь создать итеративный подход к изумительной игре. Класс содержит поля для двумерного массива строк, называемого "board", и имеет двумерный массив логических значений, называемый "haveVisit". Метод, который вызывает test 2, проходит по всей доске, находя позиции первого символа целевой строки, затем передает координаты в метод test2, возвращая список, содержащий координаты.
Метод return1Index принимает координату двумерного массива at, создает из него int, представляющий координаты из соответствующего 1d массива. Return2DIndex делает обратное и возвращает массив int, содержащий две координаты.
public List<Integer> test2(int row1, int row2, String findMe){
String temp = findMe;
List<Integer> output = new ArrayList<Integer>();
if (board[row1][row2].charAt(0) != findMe.charAt(0))
return output;
haveVisit = new boolean[size][size];
int row = row1;
int column = row2;
output.add(return1DIndex(row, column));
haveVisit[row][column] = true;
//for each letter in the string
for(int j = 0; j < temp.length(); j++)
//for every column and row combination
for (int x = row - 1; x < row + 2 ; x++)
for (int y = column - 1; y < column + 2 ; y++)
//if index is valid and not visited
if (x > -1 && y > -1 && y < size && x < size && !haveVisit[x][y])
//if the output is the same size as string, return
if(output.size() == findMe.length())
return output;
//if the character in the board matches the char we're looking for
if(board[x][y].charAt(0) == temp.charAt(j))
{
haveVisit[x][y] = true;
output.add(return1DIndex(x, y));
//update row and column indices
row = x;
column = y;
}
}
}
return output;
}
По какой-то причине этот метод работает только в 50% случаев. Этот метод отлично работает с поиском букв, когда они расположены слева направо или сверху вниз, но поиск слов справа налево или снизу вверх никогда не работает, за исключением одного случая: когда вы ищете строку длиной 1 или 2, где этот метод всегда работает.
У меня есть работающее рекурсивное решение, но я хотел попробовать этот способ. Есть мысли, почему это не сработает?
Изменить: код теперь работает справа налево, но все равно не работает при попытке поиска вверх.
1 ответ
Я не знаю точно, в чем проблема, но есть несколько подозреваемых:
Вы обновляете индексы строк и столбцов, проверяя их соседей. Это похоже на удаление элемента из массива во время его итерации: он хорошо определен, но имеет хитрую семантику. Я предлагаю либо выручить (жадный алгоритм), либо сохранить стек совпадений (более глубокий поиск также требует сохранения стека посещенных ячеек).
for
В ней отсутствуют открывающие скобки, но есть закрывающие скобки, что указывает на отсутствие кода.Я не знаком с потрясением, но разве в письме не может быть двух похожих соседей?
AXA
? Просто делаяoutput.add(return1DIndex(x, y));
Вы можете выводить два способа получить одну и ту же букву. Вы можете в конечном итоге сoutput
длиннее чемfindMe
,
Я предлагаю придерживаться более стандартного формата поиска в глубину, пока вы устраняете ошибки. В Википедии есть нерекурсивная реализация псевдокода, например: https://en.wikipedia.org/wiki/Depth-first_search.