66 lines
1.9 KiB
Python
66 lines
1.9 KiB
Python
import random
|
|
|
|
|
|
def create_file():
|
|
n = random.randint(5, 10)
|
|
maze = []
|
|
for _ in range(n):
|
|
row = "".join(["M" if random.random() < 0.3 else " " for _ in range(n)])
|
|
maze.append(row)
|
|
with open("maze.txt", "w") as f:
|
|
for row in maze:
|
|
f.write(row + "\n")
|
|
return n
|
|
|
|
|
|
def read_maze():
|
|
with open("maze.txt") as f:
|
|
maze = [list(line.rstrip("\n")) for line in f]
|
|
return maze
|
|
|
|
|
|
def solve(maze, x, y, xc, yc, visited, length, best):
|
|
n = len(maze)
|
|
if x < 0 or y < 0 or x >= n or y >= n:
|
|
return
|
|
if maze[x][y] == "M" or visited[x][y]:
|
|
return
|
|
if length >= best[0]:
|
|
return
|
|
if x == xc and y == yc:
|
|
best[0] = min(best[0], length)
|
|
return
|
|
visited[x][y] = True
|
|
solve(maze, x + 1, y, xc, yc, visited, length + 1, best)
|
|
solve(maze, x - 1, y, xc, yc, visited, length + 1, best)
|
|
solve(maze, x, y + 1, xc, yc, visited, length + 1, best)
|
|
solve(maze, x, y - 1, xc, yc, visited, length + 1, best)
|
|
visited[x][y] = False
|
|
|
|
|
|
while True:
|
|
print("\n1 - создать лабиринт\n2 - решить\n0 - выход")
|
|
try:
|
|
c = input("Выбор: ")
|
|
if c == "1":
|
|
n = create_file()
|
|
print("Файл создан. Размер:", n)
|
|
elif c == "2":
|
|
maze = read_maze()
|
|
n = len(maze)
|
|
x = int(input("Старт X: "))
|
|
y = int(input("Старт Y: "))
|
|
xc = int(input("Сыр X: "))
|
|
yc = int(input("Сыр Y: "))
|
|
visited = [[False] * n for _ in range(n)]
|
|
best = [10**9]
|
|
solve(maze, x, y, xc, yc, visited, 0, best)
|
|
if best[0] == 10**9:
|
|
print("Путь не найден")
|
|
else:
|
|
print("Кратчайший путь:", best[0])
|
|
elif c == "0":
|
|
break
|
|
except:
|
|
print("Ошибка ввода")
|