Я работаю над вопросом алгоритма, чтобы найти слово в сетке.
Мое решение состоит в том, чтобы сначала найти первую букву слова в сетке, а затем, если она найдена, рекурсивно пройти по 8 направлениям, пока каждый индекс слова не будет сопоставлен с индексами сетки, и вернуть строку. Прикреплен мой код:
Я отслеживаю свои текущие позиции x и y, а затем увеличиваю позицию строки тогда и только тогда, когда в индексе слова есть совпадение с индексом в сетке. Однако с этим фрагментом кода что-то не так с моей рекурсией, вызывающей переполнение стека:
public static void findWord(int row, int col, char[][] grid, String w) {
int rowLength = row;
int colLength = col;
char[] word = w.toCharArray();
for(int j = 0; j < colLength; j++) {
for(int i = 0; i < rowLength; i++) {
// Check if first index of word is in this location
if(word[0] == grid[j][i]) {
// Iterate through each 8 directions to find the next word
for(int dir = 0; dir < 8; dir++) {
recursiveFind(i, j, i, j, dir, 0, word, grid, rowLength, colLength);
}
}
}
}
}
public static boolean recursiveFind(
int initialX,
int initialY,
int currentX,
int currentY,
int dir,
int currentPos,
char[] word,
char[][] grid,
int rowLength,
int colLength)
{
// base case is if currentPos == length of word
if(word.length == currentPos) {
System.out.println("Initial: " + initialX + " " + initialY);
System.out.println("Final: " + currentX + " " + currentY);
}
if(dir == 0) { // 1
currentX = currentX; // 0
currentY -= 1; // -1
} else if(dir == 1) {
currentX += 1; // 1
currentY -= 1; // -1
} else if(dir == 2) {
currentX += 1; // 1
currentY = 0; // 0
} else if(dir == 3) {
currentX += 1; // 1
currentY += 1; // 1
} else if(dir == 4) {
currentX = currentX; // 0
currentY += 1; // 1
} else if(dir == 5) {
currentX -= 1; // -1
currentY += 1; // 1
} else if(dir == 6) {
currentX -= 1; // -1
currentY = currentY; // 0
} else {
currentX -= 1; // -1
currentY -= 1; // -1
}
if(currentX < 0 ||
currentX == rowLength ||
currentY < 0 ||
currentY == colLength ||
grid[currentY][currentX] != word[currentPos]){
return false;
}
return recursiveFind(initialX, initialY, currentX, currentY, dir, currentPos + 1, word, grid, rowLength, colLength);
}
Main.java
char[][] myGrid = new char[][]{
{'H', 'Q', 'W', 'C', 'S'},
{'E', 'S', 'P', 'K', 'D'},
{'D', 'X', 'A', 'F', 'L'},
{'O', 'C', 'H', 'K', 'H'},
{'C', 'T', 'Y', 'C', 'A'},
};
String myWord = "CODE";
findWord(5, 5, myGrid, myWord);
В настоящее время я пытаюсь разместить некоторые операторы отладки, чтобы понять, в чем проблема, однако, если кто-то готов помочь мне в этом, я буду очень признателен!
РЕДАКТИРОВАТЬ:
Я исправил проблему переполнения стека с помощью return true
в базовом случае. Однако мои результаты следующие, которые не возвращают ожидаемые значения, которые я хотел.
Initial X: 3, Initial Y: 0, Dir: 0, Current X: 3, Current Y: 0
Initial X: 3, Initial Y: 0, Dir: 1, Current X: 3, Current Y: 0
Initial X: 3, Initial Y: 0, Dir: 2, Current X: 3, Current Y: 0
Initial X: 3, Initial Y: 0, Dir: 3, Current X: 3, Current Y: 0
Initial X: 3, Initial Y: 0, Dir: 4, Current X: 3, Current Y: 0
Initial X: 3, Initial Y: 0, Dir: 5, Current X: 3, Current Y: 0
Initial X: 3, Initial Y: 0, Dir: 6, Current X: 3, Current Y: 0