#c #depth-first-search #maze
#c #поиск в глубину #Лабиринт
Вопрос:
Редактировать: выход из лабиринта обнаруживается только тогда, когда вдоль границ лабиринта есть пустое место без каких-либо стен.
Редактирование 2: я немного изменил код после получения справки, но все равно столкнулся с той же проблемой. Может быть, я неправильно использовал то, что было упомянуто. Я изменил фрагмент моего кода только на одну рекурсию (часть перемещения вверх), чтобы минимизировать ненужное повторение при просмотре фрагмента.
(Все еще новичок в кодировании, надеюсь, вы не возражаете) Я пытаюсь написать код для программы, которая печатает движение человека, который находит путь через данный лабиринт.
Однако я столкнулся с проблемой, когда после достижения выхода из лабиринта человек возвращается в исходное положение, в котором он находится.
Исходное положение задается координатами (x, y).
Вот фрагмент моей функции, которая находит путь через лабиринт:
bool find_path(char **maze, long **track, long rows, long cols, long x, long y, long steps)
{
bool found;
if (goal_found(maze, rows, cols, x, y)) {
return true;
}
track[y][x] = 2;
if (maze[y - 1][x] == EMPTY amp;amp; track[y - 1][x] == 1) { // Move Up
steps ;
found = find_path(maze, track, rows, cols, x, y - 1, steps);
if (found) {
return true;
}
steps;
}
}
Комментарии:
1. Первое, что я замечаю, это то, что вы выполняете рекурсивные вызовы без использования
true
false
возвращаемого значения / . Если лабиринт решен, вызывающая функция об этом не знает.2. Возможно ли, чтобы вы уточнили это? Я не совсем понимаю, что вы имеете в виду, используя возврат true / false. Если лабиринт решен, что означает, что моя логическая функция is_goal возвращает true , тогда исходная функция search_maze также возвращает true .
3. Я имею в виду, что воплощение, которое повторило, не знает этого.
search_maze(maze, track, rows, cols, x, y - 1, steps);
Я предлагаю вамbool result = search_maze(maze, track, rows, cols, x, y - 1, steps);
, а затем предпринять соответствующие действия. Вы не можете завершить рекурсию, не пройдя через стек вызовов, ячейку за ячейкой. Промежуточные уровни вызовов не пропускаются просто возвращениемtrue
, рекурсия работает не так.4. запишите ваш возврат и проверьте его
5. Спасибо за совет!! Я попробовал это снова, но по какой-то причине у меня это не работает, возможно, я неправильно использовал то, что было упомянуто. Я добавил указанные изменения в свой код.
Ответ №1:
Ваша программа находит все пути в лабиринте; если вы хотите остановить это, вам нужно изменить свои вызовы, чтобы остановить прохождение лабиринта, если вы достигли успеха:
found = search_maze(maze, track, rows, cols, x, y 1, steps);
swap(maze, y, x, y 1, x);
if (found) {
return found;
}
При всех рекурсивных вызовах.