πŸ” Как ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚ python: Π»Π΅Π³ΠΊΠΈΠΉ Π³ΠΈΠ΄ для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…

Как ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚ Π² Python

Один ΠΈΠ· способов ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚ Π² Python - ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ поиска Π² Π³Π»ΡƒΠ±ΠΈΠ½Ρƒ (Depth First Search).


def solve_maze(maze, start, end):
    path = []
    visited = set()
    dfs(maze, start, end, path, visited)
    return path

def dfs(maze, current, end, path, visited):
    if current == end:
        path.append(current)
        return True
    visited.add(current)
    directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]  # Π’Π΅Ρ€Ρ…, Π½ΠΈΠ·, ΠΏΡ€Π°Π²ΠΎ, Π»Π΅Π²ΠΎ
    for direction in directions:
        next_row = current[0] + direction[0]
        next_col = current[1] + direction[1]
        if is_valid(maze, next_row, next_col) and (next_row, next_col) not in visited:
            if dfs(maze, (next_row, next_col), end, path, visited):
                path.append(current)
                return True
    return False

def is_valid(maze, row, col):
    rows = len(maze)
    cols = len(maze[0])
    return 0 <= row < rows and 0 <= col < cols and maze[row][col] == 0

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ 'solve_maze' с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚ΠΎΠΌ, Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΡƒΡ‚ΡŒ ΠΎΡ‚ Π½Π°Ρ‡Π°Π»Π° Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π°. Π—Π°Π΄Π°Ρ‡Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π° состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΠΏΡƒΡ‚ΡŒ ΠΎΡ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΊ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ, обходя стСны ΠΈΠ»ΠΈ ΠΏΡ€Π΅Π³Ρ€Π°Π΄Ρ‹.

Π”Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚

Как ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚ python

Π›Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Ρ‹ - это ΡƒΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΈΠ³Ρ€Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΠΏΡƒΡ‚ΡŒ ΠΎΡ‚ Ρ‚ΠΎΡ‡ΠΊΠΈ А Π΄ΠΎ Ρ‚ΠΎΡ‡ΠΊΠΈ Π‘. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° языкС Python, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚.

1. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ класс Maze

Π‘Π½Π°Ρ‡Π°Π»Π° создайтС класс Maze, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚. Π’ этом классС Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ основныС свойства Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π°, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Ρ€Π°Π·ΠΌΠ΅Ρ€, стартовая ΠΈ конСчная Ρ‚ΠΎΡ‡ΠΊΠΈ.


class Maze:
    def __init__(self, maze):
        self.maze = maze
        self.start = None
        self.end = None

2. Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚ ΠΈΠ· Ρ„Π°ΠΉΠ»Π°

Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚ ΠΈΠ· Ρ„Π°ΠΉΠ»Π°. Π’ Ρ„Π°ΠΉΠ»Π΅ каТдая строка прСдставляСт собой ΠΎΠ΄Π½Ρƒ строку Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π°, Π³Π΄Π΅ 'S' - стартовая Ρ‚ΠΎΡ‡ΠΊΠ°, 'E' - конСчная Ρ‚ΠΎΡ‡ΠΊΠ°, '#' - стСны, Π° '.' - проходимая ΠΎΠ±Π»Π°ΡΡ‚ΡŒ.


def load_maze(file_name):
    with open(file_name, 'r') as file:
        maze = [list(line.strip()) for line in file]
    return Maze(maze)

3. Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ поиска ΠΏΡƒΡ‚ΠΈ

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΠΏΡƒΡ‚ΡŒ Π² Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π΅, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ поиска Π² ΡˆΠΈΡ€ΠΈΠ½Ρƒ ΠΈΠ»ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ A*. Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ поиска Π² ΡˆΠΈΡ€ΠΈΠ½Ρƒ.


def find_path(maze):
    queue = [[maze.start]]
    visited = set()

    while queue:
        path = queue.pop(0)
        position = path[-1]

        if position == maze.end:
            return path

        if position not in visited:
            for neighbor in get_neighbors(position):
                x, y = neighbor
                if maze.maze[x][y] == '.':
                    new_path = list(path)
                    new_path.append(neighbor)
                    queue.append(new_path)
                    visited.add(position)

    return None

def get_neighbors(position):
    x, y = position
    return [(x-1, y), (x+1, y), (x, y-1), (x, y+1)]

4. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования

НаконСц, Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.


maze = load_maze('maze.txt')
path = find_path(maze)

if path:
    for position in path:
        x, y = position
        maze.maze[x][y] = '*'

for row in maze.maze:
    print(''.join(row))

ΠŸΡ€ΠΈ использовании Ρ„Π°ΠΉΠ»Π° с Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚ΠΎΠΌ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅:


#########
#..S.#..#
#.#.###.#
#.#...#.#
#.#.###.#
#.#.#...#
#...#.#.#
#.###.#E#
#########

Π’Ρ‹Π²ΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

#########
#**S#..*#
#*#.###*#
#*#...#*#
#*#.###*#
#*#.#...#
#***#.#*#
#.###.#E#
#########

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Python для прСодолСния Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π° ΠΈ нахоТдСния ΠΏΡƒΡ‚ΠΈ ΠΎΡ‚ стартовой Ρ‚ΠΎΡ‡ΠΊΠΈ Π΄ΠΎ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ. Π£Π΄Π°Ρ‡ΠΈ Π² поискС ΠΏΡƒΡ‚ΠΈ!

Π’ΠΈΠ΄Π΅ΠΎ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅

Как ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π›Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π° Π½Π° Python. Алгоритм поиска Π² Π“Π»ΡƒΠ±ΠΈΠ½Ρƒ [ Pygame ]

Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΈΠ³Ρ€Ρƒ Β«Π›Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Β» Π½Π° Python Π² Minecraft (ΠœΠ°ΠΉΠ½ΠΊΡ€Π°Ρ„Ρ‚) | ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для Π΄Π΅Ρ‚Π΅ΠΉ ΠΈ подростков

ΠΏΡ€ΠΎΡ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π° python

ΠŸΠΎΡ…ΠΎΠΆΠΈΠ΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ:

πŸ“š Как ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΡƒΡ‡ΠΈΡ‚ΡŒ Python Π±Π΅Π· Π»ΠΈΡˆΠ½ΠΈΡ… слоТностСй

πŸ“ Π—Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ python? πŸ€” Π£Π·Π½Π°ΠΉΡ‚Π΅ прямо сСйчас! πŸš€

πŸ” Как ΡƒΠ·Π½Π°Ρ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ модуля Π² Python πŸ€”

πŸ” Как ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚ python: Π»Π΅Π³ΠΊΠΈΠΉ Π³ΠΈΠ΄ для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…

πŸ”§ Как ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠ»ΠΈΠΊ ΠΌΡ‹ΡˆΠΈ Π² ΠΏΠΈΡ‚ΠΎΠ½Π΅? ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ руководство для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…

🎨 Как Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ Π² ΠΏΠΈΡ‚ΠΎΠ½Π΅ tkinter? Π›ΡƒΡ‡ΡˆΠΈΠ΅ инструкции для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…

πŸ” Как ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Python Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ? Π’Π°ΠΆΠ½Ρ‹Π΅ совСты ΠΈ Π³Π°ΠΉΠ΄