last lab
This commit is contained in:
65
labPython/lab20/task_1.py
Normal file
65
labPython/lab20/task_1.py
Normal file
@@ -0,0 +1,65 @@
|
||||
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("Ошибка ввода")
|
||||
Reference in New Issue
Block a user