Решение лабиринтов: поиск DFS, BFS и A* с примерами кода

Теперь давайте обсудим некоторые методы и приведем примеры кода для решения лабиринтов. Обратите внимание, что примеры кода написаны на Python.

  1. Поиск в глубину (DFS).
    DFS — популярный алгоритм решения лабиринтов. Он исследует лабиринт, проходя как можно дальше по каждой ветке, прежде чем вернуться назад. Вот пример реализации:
def dfs(maze, start, end):
    stack = [(start, [])]
    visited = set()
    while stack:
        current, path = stack.pop()
        if current == end:
            return path + [current]
        if current not in visited:
            visited.add(current)
            neighbors = get_neighbors(maze, current)
            stack.extend((n, path + [current]) for n in neighbors)
    return None
  1. Поиск в ширину (BFS):
    BFS — еще один широко используемый алгоритм решения лабиринтов. Он исследует лабиринт, сначала посещая всех соседей, прежде чем перейти на следующий уровень. Вот пример реализации:
from collections import deque
def bfs(maze, start, end):
    queue = deque([(start, [])])
    visited = set()
    while queue:
        current, path = queue.popleft()
        if current == end:
            return path + [current]
        if current not in visited:
            visited.add(current)
            neighbors = get_neighbors(maze, current)
            queue.extend((n, path + [current]) for n in neighbors)
    return None
  1. AПоиск:
    A
    Поиск – это алгоритм информированного поиска, который использует эвристику для управления процессом поиска. Он оценивает узлы на основе комбинации стоимости достижения узла и предполагаемой стоимости достижения цели. Вот пример реализации:
import heapq
def heuristic(node, goal):
    return abs(node[0] - goal[0]) + abs(node[1] - goal[1])
def astar(maze, start, end):
    heap = [(heuristic(start, end), 0, start, [])]
    visited = set()
    while heap:
        _, cost, current, path = heapq.heappop(heap)
        if current == end:
            return path + [current]
        if current not in visited:
            visited.add(current)
            neighbors = get_neighbors(maze, current)
            for n in neighbors:
                heapq.heappush(heap, (cost + 1 + heuristic(n, end), cost + 1, n, path + [current]))
    return None

Это лишь несколько примеров методов решения лабиринтов. Вы можете изучить другие алгоритмы и их варианты, например алгоритм Дейкстры, итеративный поиск в глубину с углублением (IDDFS) и другие.