π ΠΠ°ΠΊ ΠΏΡΠΎΠΉΡΠΈ Π»Π°Π±ΠΈΡΠΈΠ½Ρ 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 Π΄Π»Ρ ΠΏΡΠ΅ΠΎΠ΄ΠΎΠ»Π΅Π½ΠΈΡ Π»Π°Π±ΠΈΡΠΈΠ½ΡΠ° ΠΈ Π½Π°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΠΏΡΡΠΈ ΠΎΡ ΡΡΠ°ΡΡΠΎΠ²ΠΎΠΉ ΡΠΎΡΠΊΠΈ Π΄ΠΎ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΉ ΡΠΎΡΠΊΠΈ. Π£Π΄Π°ΡΠΈ Π² ΠΏΠΎΠΈΡΠΊΠ΅ ΠΏΡΡΠΈ!