пройти все ячейки кроме черных

как мне пройти даную задачу на пайтоне? как я понимаю надо делать что-то в плане матриц, но как именно заставить программу искать путь?

туть


Ответы (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). Правда уже придётся подождать подольше.

Решение

→ Ссылка