Проблема: -
Я пытаюсь решить задачу навигации 2d лабиринт в C ++, используя 2-мерный массив.Чтобы дать краткое представление о самой проблеме, я намерен перейти от узла 'S' в массиве к узлу 'G', пройдя через свободные места, обозначенные как '.'Узлы "#" являются препятствиями.Нельзя перемещаться в местах, обозначенных как препятствия.Необходимо также следить за тем, чтобы все ходы были законными (в пределах пространства конфигурации).Я обозначаю действительный ход знаком «+» после замены «.»Если вы хотите узнать больше об этой проблеме (не обязательно), пожалуйста, обратитесь по этой ссылке .
В чем проблема?
Я закодировалрекурсивный алгоритм для этой задачи, где мы получаем массив и позицию начального узла, а затем пытаемся перейти к целевому узлу с помощью рекурсии.Однако я получаю ошибку переполнения стека.Кажется, моя рекурсия никогда не прекращается.Я твердо верю, что есть какая-то проблема в моей функции play () или моей функции check ().Я не уверен, в чем на самом деле проблема.
Что я попробовал?
Я воспроизводлю свой код ниже:
void spawn(std::string (&board)[6]) {
for (int i = 0; i <= 6; i++) {
std::cout << board[i] << std::endl;
}
}
bool check(size_t a, size_t b, const std::string (&board)[6]) {
if (a < board[1].size() && a >= 0 && b < board[1].size() && b >= 0) {
if (board[a][b] == '#' || board[a][b] == '+')
return false;
else if (board[a][b] == '.')
return true;
}
return false;
}
void play(std::string (&board)[6], size_t a, size_t b) {
auto status = check(a, b, board);
if (board[a][b] == 'G' || board[a][b] == 'g') {
spawn(board);
return;
}
if (status) {
board[a][b] = '+';
play(board, ++a, b);
play(board, --a, b);
play(board, a, ++b);
play(board, a, --b);
}
}
int main() {
std::string grid[6] = {{"S#####"},
{".....#"},
{"#.####"},
{"#.####"},
{"...#.G"},
{"##...#"}};
play(grid, 0, 0);
return 0;
}