Non recursive Queue/Tree solution implementation
This commit is contained in:
@@ -2,12 +2,14 @@ package solvemaze
|
||||
|
||||
import (
|
||||
"mazesolver/internal/getmaze"
|
||||
"mazesolver/util/queue"
|
||||
)
|
||||
|
||||
func FindPath(maze getMaze.Maze) []getMaze.Point {
|
||||
returnSlice := make([]getMaze.Point, 0)
|
||||
debugMaze := GetDebugMaze(maze)
|
||||
findPathRecursive(maze[1][1], maze, &returnSlice, debugMaze)
|
||||
//debugMaze := GetDebugMaze(maze)
|
||||
//findPathRecursive(maze[1][1], maze, &returnSlice, debugMaze)
|
||||
findPathNonRecursive(maze, maze[1][1], &returnSlice)
|
||||
return returnSlice
|
||||
}
|
||||
|
||||
@@ -49,3 +51,42 @@ func GetDebugMaze(maze getMaze.Maze) getMaze.Maze {
|
||||
}
|
||||
return a
|
||||
}
|
||||
|
||||
func findPathNonRecursive(maze getMaze.Maze, root getMaze.Point, slice *[]getMaze.Point) {
|
||||
next := buildMaze(maze, root)
|
||||
for next != nil {
|
||||
*slice = append(*slice, *next)
|
||||
next = next.Parent
|
||||
}
|
||||
}
|
||||
|
||||
func buildMaze(maze getMaze.Maze, root getMaze.Point) *getMaze.Point {
|
||||
Q := make(queue.Queue[getMaze.Point], 0)
|
||||
root.Value = -1
|
||||
Q.Enqueue(root)
|
||||
for len(Q) > 0 {
|
||||
v := Q.Dequeue()
|
||||
if v.Value == 9 {
|
||||
return (&v)
|
||||
}
|
||||
for _, w := range getAdjacent(v, maze) {
|
||||
if (w.Value == 0 || w.Value == 9) {
|
||||
maze[w.Y][w.X].Value = -1
|
||||
w.Parent = &v
|
||||
Q.Enqueue(w)
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func contains(maze getMaze.Maze, val int) bool {
|
||||
for _, v := range maze {
|
||||
for _, vv := range v {
|
||||
if vv.Value == val {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user