Added a solver: turn left
This commit is contained in:
parent
a80e2c9cc3
commit
5500007fb4
63
solver/turn_left.go
Normal file
63
solver/turn_left.go
Normal 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
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user