Added a solver: turn left

This commit is contained in:
Karma Riuk 2023-08-10 19:39:16 +02:00
parent 144d3c2aed
commit e5840321e2

63
solver/turn_left.go Normal file
View File

@ -0,0 +1,63 @@
package solver
import (
"maze-solver/maze"
"maze-solver/utils"
)
type TurnLeftSolver struct {
visited map[*maze.Node]bool
}
func (s *TurnLeftSolver) Solve(m *maze.Maze) *maze.SolvedMaze {
defer utils.Timer("Turn left algorithm", 2)()
current, end := m.Nodes[0], m.Nodes[len(m.Nodes)-1]
s.visited = make(map[*maze.Node]bool, len(m.Nodes))
for _, node := range m.Nodes {
s.visited[node] = false
}
stack := make([]*maze.Node, 0, len(m.Nodes))
stack = append(stack, current)
for current != end {
s.visited[current] = true
left_visited, right_visited, up_visited, down_visited := s.wasVisited(current.Left), s.wasVisited(current.Right), s.wasVisited(current.Up), s.wasVisited(current.Down)
if left_visited && right_visited && up_visited && down_visited {
// dead end or no more visited nodes
stack = stack[:len(stack)-1]
current = stack[len(stack)-1]
} else {
if !left_visited {
current = current.Left
} else if !down_visited {
current = current.Down
} else if !right_visited {
current = current.Right
} else if !up_visited {
current = current.Up
}
stack = append(stack, current)
}
}
ret := &maze.SolvedMaze{
Maze: m,
Solution: stack,
}
return ret
}
func (s *TurnLeftSolver) wasVisited(node *maze.Node) bool {
if node == nil {
return true
}
visited, _ := s.visited[node]
return visited
}