Chciałem generować jakieś labirynty pomocą najprostszy algorytm, ale wszyscy moi labirynty wyglądać następująco jednym:Maze pokolenie używając DFS nie powiedzie się i nie wiem dlaczego
Oto kawałek kodu Java (funkcja whatVisit działa poprawnie, nie patrz na nią):
private void dfs(Point start, boolean[][] visited) {
Point nextCell = whatVisit(start, visited);
if(nextCell == null) // if there's nothing to visit
return;
// mark current cell as visited
visited[start.y][start.x] = true;
// destroy the wall between current cell and the new one
borders[(start.y + nextCell.y)/2][(start.x + nextCell.x)/2] = true;
// start a new search from found cell
dfs(nextCell, visited);
}
private Point whatVisit(Point p, boolean[][] visited) {
Vector<Point>cells = new Vector<Point>(); // to store acessible cells
// lookaround
if(p.x - 2 >= 0 && !visited[p.y][p.x - 2])
cells.add(new Point(p.x - 2, p.y));
if(p.x + 2 < visited[0].length && !visited[p.y][p.x + 2])
cells.add(new Point(p.x + 2, p.y));
if(p.y - 2 >= 0 && !visited[p.y - 2][p.x])
cells.add(new Point(p.x, p.y - 2));
if(p.y + 2 < visited.length && !visited[p.y + 2][p.x])
cells.add(new Point(p.x, p.y + 2));
// instead of Random
Collections.shuffle(cells);
// returns null if there are no acessible cells around
if(cells.size() > 0)
return cells.get(0);
else return null;
}
I wiem, dlaczego to nie działa! Gdy DFS w końcu dotrze do miejsca, w którym nie ma dostępnych komórek, po prostu wychodzi, aby zacząć.
Jak to naprawić i zmusić do poprawnej pracy?
Dzięki.
Zamiast wracać do początku, co chciałbyś zrobić, gdy DFS dojdzie do miejsca, w którym nie ma dostępnych komórek? Myślę, że moją własną skłonnością może być próba rozpoczęcia kolejnego szukania ścieżki od gdzieś w ścieżce/ścieżkach/s już utworzonych i być może wejście i wyjście. –