Advertisement
Hasli4

backtrack10

Mar 27th, 2025
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.72 KB | None | 0 0
  1. import os
  2.  
  3. def find_cheese_paths(maze, start_x, start_y, cheese_x, cheese_y):
  4.     """
  5.    Рекурсивная функция для подсчета путей мышки к сыру в лабиринте
  6.    
  7.    Параметры:
  8.    maze - двумерный список лабиринта
  9.    start_x, start_y - начальные координаты мышки
  10.    cheese_x, cheese_y - координаты сыра
  11.    
  12.    Возвращает:
  13.    Количество различных путей до сыра
  14.    """
  15.     # Размер лабиринта
  16.     N = len(maze)
  17.    
  18.     # Создаем копию лабиринта для отслеживания посещенных клеток
  19.     visited = [[False for _ in range(N)] for _ in range(N)]
  20.    
  21.     def is_valid_move(x, y):
  22.         """
  23.        Проверка корректности движения
  24.        - Координаты в пределах лабиринта
  25.        - Нет стены
  26.        - Клетка не посещена
  27.        """
  28.         return (
  29.             0 <= x < N and
  30.             0 <= y < N and
  31.             maze[x][y] != 'M' and
  32.             not visited[x][y]
  33.         )
  34.    
  35.     def dfs(current_x, current_y):
  36.         """
  37.        Рекурсивный обход в глубину для подсчета путей
  38.        
  39.        Базовые случаи:
  40.        1. Мышка достигла сыра
  41.        2. Невозможность движения
  42.        """
  43.         # Достижение сыра
  44.         if current_x == cheese_x and current_y == cheese_y:
  45.             return 1
  46.        
  47.         # Отмечаем текущую клетку как посещенную
  48.         visited[current_x][current_y] = True
  49.        
  50.         # Возможные направления движения (вверх, вправо, вниз, влево)
  51.         directions = [
  52.             (-1, 0),  # Вверх
  53.             (0, 1),   # Вправо
  54.             (1, 0),   # Вниз
  55.             (0, -1)   # Влево
  56.         ]
  57.        
  58.         total_paths = 0
  59.        
  60.         #探索每个方向
  61.         for dx, dy in directions:
  62.             next_x, next_y = current_x + dx, current_y + dy
  63.            
  64.             # Проверка возможности перемещения
  65.             if is_valid_move(next_x, next_y):
  66.                 # Рекурсивный вызов для следующей позиции
  67.                 total_paths += dfs(next_x, next_y)
  68.        
  69.         # Возвращаем клетку в непосещенное состояние (backtracking)
  70.         visited[current_x][current_y] = False
  71.        
  72.         return total_paths
  73.    
  74.     # Начинаем поиск путей с начальной позиции мышки
  75.     return dfs(start_x, start_y)
  76.  
  77. def read_maze_from_file(filename):
  78.     """
  79.    Чтение лабиринта из текстового файла
  80.    """
  81.     with open(filename, 'r') as f:
  82.         return [list(line.strip()) for line in f]
  83.  
  84. def main():
  85.     # Путь к файлу с лабиринтом
  86.     maze_file = 'maze.txt'
  87.    
  88.     # Чтение лабиринта
  89.     maze = read_maze_from_file(maze_file)
  90.    
  91.     # Параметры: начальная позиция мышки и позиция сыра
  92.     start_x, start_y = 0, 0     # Пример начальной позиции
  93.     cheese_x, cheese_y = 4, 4   # Пример позиции сыра
  94.    
  95.     # Подсчет путей
  96.     paths_count = find_cheese_paths(maze, start_x, start_y, cheese_x, cheese_y)
  97.    
  98.     print(f"Количество различных путей: {paths_count}")
  99.  
  100. if __name__ == "__main__":
  101.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement