2026-rff_mp/VildyaevAV/docs/task2/main.py
2026-05-21 21:50:03 +03:00

112 lines
2.5 KiB
Python

import csv
from builder import TextFileMazeBuilder
from strategies import BFSStrategy, DFSStrategy, AStarStrategy
from solver import MazeSolver
from observer import ConsoleView
def print_path(maze, path):
path_coords = {(cell.x, cell.y) for cell in path}
for row in maze.cells:
line = ""
for cell in row:
if cell.is_wall:
line += "#"
elif cell.is_start:
line += "S"
elif cell.is_exit:
line += "E"
elif (cell.x, cell.y) in path_coords:
line += "*"
else:
line += " "
print(line)
builder = TextFileMazeBuilder()
maze_files = [
"docs/task2/mazes/small.txt",
"docs/task2/mazes/medium.txt",
"docs/task2/mazes/blocked.txt",
"docs/task2/mazes/large.txt",
"docs/task2/mazes/empty.txt",
"docs/task2/mazes/no_exit.txt"
]
strategies = [
BFSStrategy(),
DFSStrategy(),
AStarStrategy()
]
results = []
for maze_file in maze_files:
print("\n======================")
print("Maze:", maze_file)
try:
maze = builder.build_from_file(maze_file)
except Exception as e:
print("Error:", e)
continue
for strategy in strategies:
print("\nStrategy:", strategy.__class__.__name__)
solver = MazeSolver(maze, strategy)
observer = ConsoleView()
solver.add_observer(observer)
runs = 5
total_time = 0
last_stats = None
last_path = []
for _ in range(runs):
stats, path = solver.solve()
total_time += stats.time_ms
last_stats = stats
last_path = path
average_time = total_time / runs
print("Average time ms:", round(average_time, 4))
print("Visited:", last_stats.visited_cells)
print("Path length:", last_stats.path_length)
if last_path:
print_path(maze, last_path)
else:
print("Path not found")
results.append([
maze_file,
strategy.__class__.__name__,
round(average_time, 4),
last_stats.visited_cells,
last_stats.path_length
])
with open("maze_results.csv", "w", newline="", encoding="utf-8") as file:
writer = csv.writer(file)
writer.writerow([
"maze",
"strategy",
"time_ms",
"visited_cells",
"path_length"
])
writer.writerows(results)
print("\nResults saved to maze_results.csv")