From 120bd29d863f60e6c4f08d8c9d0b3ea958fe8d53 Mon Sep 17 00:00:00 2001 From: Karma Riuk Date: Tue, 15 Aug 2023 15:41:24 +0200 Subject: [PATCH] refactor: removed map for visited and added field to node --- maze/maze.go | 1 + solver/bfs.go | 16 ++-------------- solver/dfs.go | 9 +++------ solver/solver.go | 20 ++------------------ 4 files changed, 8 insertions(+), 38 deletions(-) diff --git a/maze/maze.go b/maze/maze.go index 73f60f2..002a507 100644 --- a/maze/maze.go +++ b/maze/maze.go @@ -30,6 +30,7 @@ type Node struct { Coords Coordinates Up, Down *Node Left, Right *Node + Visited bool `default:"false"` } func NewNode(coords Coordinates) *Node { diff --git a/solver/bfs.go b/solver/bfs.go index 0bcf34c..c7a961f 100644 --- a/solver/bfs.go +++ b/solver/bfs.go @@ -9,7 +9,6 @@ import ( ) type BFSSolver struct { - solver queue *Queue } @@ -76,8 +75,6 @@ func history_str(history []*maze.Node) string { func (s *BFSSolver) Solve(m *maze.Maze) *maze.SolvedMaze { defer utils.Timer("BFS algorithm", 2)() - s.initVisited(m) - current, end := m.Nodes[0], m.Nodes[len(m.Nodes)-1] s.queue = &Queue{ head: nil, @@ -87,20 +84,15 @@ func (s *BFSSolver) Solve(m *maze.Maze) *maze.SolvedMaze { current_history := make([]*maze.Node, 0, len(m.Nodes)) current_history = append(current_history, current) - // fmt.Printf("end.Coords: %v\n", end.Coords) var err error for current != end { - // fmt.Printf("current.Coords: %v\n", current.Coords) - - s.visited[current] = true + current.Visited = true s.addIfNotVisited(current.Down, current_history) s.addIfNotVisited(current.Left, current_history) s.addIfNotVisited(current.Right, current_history) s.addIfNotVisited(current.Up, current_history) - // fmt.Println(s.queue) - current_history, err = s.queue.dequeue() if err != nil { panic(err) @@ -108,10 +100,6 @@ func (s *BFSSolver) Solve(m *maze.Maze) *maze.SolvedMaze { current = current_history[len(current_history)-1] } - // for i, node := range current_history { - // fmt.Printf("%v: %v\n", i, node.Coords) - // } - return &maze.SolvedMaze{ Maze: m, Solution: current_history, @@ -119,7 +107,7 @@ func (s *BFSSolver) Solve(m *maze.Maze) *maze.SolvedMaze { } func (s *BFSSolver) addIfNotVisited(node *maze.Node, current_history []*maze.Node) { - if !s.wasVisited(node) { + if !wasVisited(node) { new_history := make([]*maze.Node, len(current_history)+1) copy(new_history, current_history) new_history[len(current_history)] = node diff --git a/solver/dfs.go b/solver/dfs.go index cded04a..af27105 100644 --- a/solver/dfs.go +++ b/solver/dfs.go @@ -5,23 +5,20 @@ import ( "maze-solver/utils" ) -type DFSSolver struct { - solver -} +type DFSSolver struct{} func (s *DFSSolver) Solve(m *maze.Maze) *maze.SolvedMaze { defer utils.Timer("DFS algorithm", 2)() - s.initVisited(m) current, end := m.Nodes[0], m.Nodes[len(m.Nodes)-1] stack := make([]*maze.Node, 0, len(m.Nodes)) stack = append(stack, current) for current != end { - s.visited[current] = true + current.Visited = 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) + left_visited, right_visited, up_visited, down_visited := wasVisited(current.Left), wasVisited(current.Right), wasVisited(current.Up), wasVisited(current.Down) if left_visited && right_visited && up_visited && down_visited { // dead end or no more visited nodes diff --git a/solver/solver.go b/solver/solver.go index 5901dd7..68f4f2f 100644 --- a/solver/solver.go +++ b/solver/solver.go @@ -9,10 +9,6 @@ type Solver interface { Solve(*maze.Maze) *maze.SolvedMaze } -type solver struct { - visited map[*maze.Node]bool -} - type SolverFactory struct { Type *string } @@ -37,18 +33,6 @@ func (f *SolverFactory) Get() Solver { panic(fmt.Sprintf("Unrecognized solver type %q", *f.Type)) } -func (s *solver) wasVisited(node *maze.Node) bool { - if node == nil { - return true - } - visited, _ := s.visited[node] - return visited -} - -func (s *solver) initVisited(m *maze.Maze) { - s.visited = make(map[*maze.Node]bool, len(m.Nodes)) - - for _, node := range m.Nodes { - s.visited[node] = false - } +func wasVisited(node *maze.Node) bool { + return node == nil || node.Visited }