From 29495a0edaccb89c4fc9e28c30ff9664524969b2 Mon Sep 17 00:00:00 2001 From: 4eker <423785z@gmail.com> Date: Fri, 22 May 2026 23:58:06 +0300 Subject: [PATCH] add MazeSolver --- pomelovsd/ExitMaze/MazeSolver/SearchStats.py | 0 pomelovsd/ExitMaze/MazeSolver/Solver.py | 20 ++++++++++++ pomelovsd/ExitMaze/Strategies/A*.py | 34 ++++++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 pomelovsd/ExitMaze/MazeSolver/SearchStats.py create mode 100644 pomelovsd/ExitMaze/MazeSolver/Solver.py diff --git a/pomelovsd/ExitMaze/MazeSolver/SearchStats.py b/pomelovsd/ExitMaze/MazeSolver/SearchStats.py new file mode 100644 index 0000000..e69de29 diff --git a/pomelovsd/ExitMaze/MazeSolver/Solver.py b/pomelovsd/ExitMaze/MazeSolver/Solver.py new file mode 100644 index 0000000..4d304da --- /dev/null +++ b/pomelovsd/ExitMaze/MazeSolver/Solver.py @@ -0,0 +1,20 @@ +from SearchStats import SearchStats +import time + +class MazeSolver: + + def __init__(self, maze, strategy): + self.maze = maze + self.strategy = strategy + + def setStrategy(self, strategy): + self.strategy = strategy + + def solve(self): + start = time.perf_counter() + + path, visited = self.strategy.findPath(self.maze, self.maze.start, self.maze.exit) + + end = time.perf_counter() + + return SearchStats((end-start)*1000, visited, len(path)), path \ No newline at end of file diff --git a/pomelovsd/ExitMaze/Strategies/A*.py b/pomelovsd/ExitMaze/Strategies/A*.py index e69de29..87c975f 100644 --- a/pomelovsd/ExitMaze/Strategies/A*.py +++ b/pomelovsd/ExitMaze/Strategies/A*.py @@ -0,0 +1,34 @@ +from strat import PathFindingStrategy +from path import restore +import heapq + +class AStar(PathFindingStrategy): + + def heuristic(self, a, b): + return abs(a.x - b.x)+ abs(a.y - b.y) + + def findPath(self, maze, start, exit): + heap = [(0, start)] + parent = {} + g = {start: 0} + visited = set() + + while heap: + _, current = heapq.heappop(heap) + + if current == exit: + break + + visited.add(current) + + for n in maze.get_neigbors(current): + tentative = g[current] + 1 + + if n not in g or tentative < g[n]: + g[n] = tentative + priority = tentative + self.heuristic(n, exit) + heapq.heappush(heap, (priority, n)) + parent[n] = current + + return self.restore(parent, start, exit), len(visited) + \ No newline at end of file