пройти все ячейки кроме черных
как мне пройти даную задачу на пайтоне? как я понимаю надо делать что-то в плане матриц, но как именно заставить программу искать путь?
Ответы (1 шт):
Автор решения: GrAnd
→ Ссылка
Для такого относительно маленького поля путь можно и в лоб рекурсией подобрать. Первый путь находится за пару секунд.
import matplotlib.pyplot as plt
S, F, W, X = 1, 2, 0, None
FIELD = [[X,S,W,W,W,W],
[W,W,W,W,W,W],
[W,W,W,W,W,W],
[W,W,W,W,W,F],
[W,W,W,X,W,W],
[W,W,W,W,W,W]]
ROWS = len(FIELD)
COLS = len(FIELD[0])
START_POS = [(i, line.index(S)) for i, line in enumerate(FIELD) if S in line][0]
FINISH_POS = [(i, line.index(F)) for i, line in enumerate(FIELD) if F in line][0]
STEPS = sum(line.count(W) for line in FIELD) + 1
print("Start:", START_POS, "\nFinish:", FINISH_POS, "\nTotal steps:", STEPS)
def do_step(level, path, points):
global FIELD
r, c = points[-1] # координаты ячейки где сейчас находимся
if r<0 or c<0 or r>=ROWS or c>=COLS or FIELD[r][c] == X:
# попали за границы поля или в чёрную ячейку - тупик,
# возвращаемся назад чтобы пробовать другие направления
return
if level == STEPS and (r, c) == FINISH_POS:
# набрали нужное количество шагов (значит побывали везде)
# и попали в ячейку с координатами финиша - всё, путь найден
print("Found path:", path) # напечатаем как двигались
# ну и нарисуем красивую картинку с путём
yy, xx = zip(*points)
plt.plot(xx, yy, "-ok")
plt.gca().invert_yaxis()
plt.show()
exit()
# продолжаем искать путь дальше...
current = FIELD[r][c] # сохраняем значение текущей ячейки
FIELD[r][c] = X # и помечаем текущую ячейку чёрным (чтобы больше в неё не заходить)
for dr, dc, dir in ((-1,0,'^'), (0,1,'>'), (1,0,'v'), (0,-1,'<')):
# рекурсивно идём дальше во все стороны (вверх, вправо, вниз, влево) от текущей ячейки
do_step(level+1, path+dir, points+[(r+dr,c+dc)])
FIELD[r][c] = current # возвращаем как было
# стартуем с координат стартовой ячейки
do_step(0, "", [START_POS])
# все варианты перебрали, но путь так и не нашли
print("No path's found.")
Если выкинуть из программы exit(), то можно будет посмотреть на все варианты путей (их всего то 126). Правда уже придётся подождать подольше.

