Я сделал небольшой рекурсивный алгоритм, чтобы найти решение лабиринта в следующем форматеНайти кратчайший путь в лабиринте с рекурсивным алгоритмом
###S###
##___##
##_#_##
#__#_##
#E___##
Где «#» представляет собой стену, и «_» представляет открытое пространство (свободное передвижение). «S» представляет начальное местоположение, «E» обозначает конечное местоположение.
Мой алгоритм работает нормально, но мне интересно, как его изменить, чтобы работать для кратчайшего пути.
/**
* findPath()
*
* @param location - Point to search
* @return true when maze solution is found, false otherwise
*/
private boolean findPath(Point location) {
// We have reached the end point, and solved the maze
if (location.equals(maze.getEndCoords())) {
System.out.println("Found path length: " + pathLength);
maze.setMazeArray(mazeArray);
return true;
}
ArrayList<Point> possibleMoves = new ArrayList<Point>();
// Move Right
possibleMoves.add(new Point(location.x + 1, location.y));
// Down Move
possibleMoves.add(new Point(location.x, location.y - 1));
// Move Left
possibleMoves.add(new Point(location.x - 1, location.y));
// Move Up
possibleMoves.add(new Point(location.x, location.y + 1));
for (Point potentialMove : possibleMoves) {
if (spaceIsFree(potentialMove)) {
// Move to the free space
mazeArray[potentialMove.x][potentialMove.y] = currentPathChar;
// Increment path characters as alphabet
if (currentPathChar == 'z')
currentPathChar = 'a';
else
currentPathChar++;
// Increment path length
pathLength++;
// Find the next path to traverse
if (findPath(potentialMove)) {
return true;
}
// Backtrack, this route doesn't lead to the end
mazeArray[potentialMove.x][potentialMove.y] = Maze.SPACE_CHAR;
if (currentPathChar == 'a')
currentPathChar = 'z';
else
currentPathChar--;
// Decrease path length
pathLength--;
}
}
// Previous space needs to make another move
// We will also return false if the maze cannot be solved.
return false;
}
В первом квартале я нахожу путь и разбиваю его. Также задан массив char [] [] с указанным на нем способом, который впоследствии будет распечатан в качестве результата.
Это хорошо работает, но мне интересно, какой был бы лучший способ изменить его, чтобы не вырваться после того, как он найдет первый успешный путь, но продолжайте идти, пока не найдет самый короткий путь.
Я попытался сделать что-то подобное, изменив метод findPath() и добавив переменную shortestPath и hasFoundPath. Первая указывающая длина кратчайшего пути, найденного до сих пор, и переменная hasFoundPath, указывающая, найден ли мы какой-либо путь.
// We have reached the end point, and solved the maze
if (location.equals(maze.getEndCoords())) {
System.out.println("Found path length: " + pathLength);
// Is this path shorter than the previous?
if (hasFoundPath && pathLength < shortestPathLength) {
maze.setMazeArray(mazeArray);
shortestPathLength = pathLength;
} else if (!hasFoundPath) {
hasFoundPath = true;
maze.setMazeArray(mazeArray);
shortestPathLength = pathLength;
}
//return true;
}
Но я не был в состоянии получить его, чтобы установить mazeArray правильные значения любого кратчайшего пути может найти.
Любое руководство будет оценено :) Спасибо
методspaceIsFree() просто убеждается вверх/влево/вниз/вправо координаты действительны, прежде чем перейти к ним. Таким образом, он гарантирует, что char является «_» или «E», и это не выходит за рамки.
Нужно ли быть рекурсивным алгоритмом? Одним из важных аспектов алгоритма Дейкстры * является разделяемая память, что сложнее реализовать в контексте рекурсии. –
Нет, это не обязательно, просто простой алгоритм, который я первоначально реализовал вначале для его решения. – bbedward