рекурсия — C ++: рекурсивная сетка с обратным отслеживанием

Я понимаю, что этот код может быть немного плотным для чтения, и я попытался приспособить стандартный алгоритм решения рекурсивных лабиринтов — где все направления пробуются до тех пор, пока не найдено решение, к алгоритму игры «ошеломительно» это проверяет, может ли целевое слово сформироваться в сетке, если идти в любом из четырех направлений. Я понимаю, что этот код содержит более одной ошибки, но мне хотелось бы узнать, как решить самое важное, например, что направление и способ поиска в сетке, очевидно, не работают.

Консольный вывод:

Enter word:
aefn
First matching letter found at [row: 0] [col: 0]
findNext: Point location: Y[0] X[0]

Point location: Y[0] X[-1]
A //(This is the algorithm trying to find "targetWord" on grid "currentWord")
Point location: Y[1] X[0]
AA
Point location: Y[0] X[0]
AAE
Point location: Y[0] X[-1]
AAEA
Point location: Y[1] X[0]
AAEAA
Point location: Y[0] X[1]
AAEAAA
Point location: Y[-1] X[0]
AAEAAAA
Point location: Y[1] X[1]
AAEE
Point location: Y[1] X[0]
AAEEU
Point location: Y[2] X[1]
AAEEUU
Point location: Y[1] X[2]
AAEEUUU
Point location: Y[0] X[1]
AAEEUUUU
Point location: Y[0] X[2]
AAEEE
Point location: Y[-1] X[1]
AAEEEE
Point location: Y[0] X[1]
AAA
Point location: Y[1] X[-1]
AAAE
Point location: Y[2] X[0]
AAAEE
Point location: Y[1] X[1]
AAAEEE
Point location: Y[0] X[0]
AAAEEEE
Point location: Y[-1] X[0]
AAAA

Код:

enum Direction { NORTH,
EAST,
SOUTH,
WEST };

/**  Attempts to find a matching letter on the grid to the first letter in the
*  targetWord, if found it stores it location in grid in 'point' and calls
*  findNext() with the location of matching letter stored in the 'point'.
*/
bool findMatchingFirstLetter(Grid<char> &cubeGrid, string currentWord, string targetWord, int index)
{

for (int row = 0; row < cubeGrid.numRows(); row++)
{
for (int col = 0; col < cubeGrid.numCols(); col++)
{
if (cubeGrid.get(row, col ) == targetWord[0])
{
cout <<  "First matching letter found at [row: " << row << "] [col: " << col << "]" << endl;
GPoint point(col, row);
cout << "findNext: " << findNextRecur(cubeGrid, currentWord, targetWord, index, point) << endl;

}
}
}
return false;
}/**  Recursive function.
*  Exhaustively searches the grid for all possible combinations, moving in all
*  compass directions. */
bool findNextRecur(Grid<char> &cubeGrid, string currentWord, string targetWord, int index, GPoint point)
{
cout << "Point location: Y[" << point.getY() << "] X[" << point.getX() << "]" << endl;
cout << currentWord << endl;
if (currentWord == targetWord)
return true;
if (currentWord.length() > targetWord.length() ||
point.getX() > cubeGrid.numCols() ||
point.getX() < 0 ||
point.getY() > cubeGrid.numRows() ||
point.getY() < 0)
{ return false; }for (Direction dir = NORTH; dir <= WEST; dir++ )
{

if (findNextRecur(cubeGrid,
currentWord += cubeGrid.get(point.getY(), point.getX()),
targetWord,
index,    //index is currently not in use.
adjacentPoint(point, dir)))
{ return true; }
}
}GPoint adjacentPoint(GPoint point, Direction dir)
{
switch  (dir) {
case NORTH: return GPoint(point.getY()-1, point.getX());
case EAST: return GPoint(point.getY(), point.getX()+1);
case SOUTH: return GPoint(point.getY()+1, point.getX());
case WEST: return GPoint(point.getY(), point.getX()-1);
}
return point;
}/**  Wrapper
*/
bool findWordOnGrid(Grid<char> &cubeGrid, string word)
{
cout << findMatchingFirstLetter(cubeGrid, "", toUpperCase(word), 0) << endl;
return true;
}

2

Решение

Не уверен, что это единственная проблема, но currentWord += ... должно быть только currentWord + .... += меняет местный currentWord переменная, поскольку каждое из 4 направлений прощупывается, а не просто передается новое currentWord в рекурсивную функцию.

1

Другие решения

Других решений пока нет …