найти пути через лабиринт

Я хочу найти возможный путь в лабиринте от начала до конца Я написал код, но он дает мне только какой-то путь в лабиринте... Мне нужны все пути Пожалуйста, дайте несколько предложений


person user2991556    schedule 14.11.2013    source источник
comment
Рекурсия — ваш друг.   -  person Inbar Rose    schedule 14.11.2013
comment
Я не могу понять ваше представление сетки. Если 0 означает разрешено, 1 — заблокировано, и у вас есть сетка 4x4, не нужно ли вам более четырех списков для описания возможных ребер?   -  person hardmath    schedule 14.11.2013
comment
@InbarRose: его функция уже рекурсивна, так что это не очень полезно.   -  person abarnert    schedule 14.11.2013
comment
Почему вы удалили весь свой код? ответы на питоне с измененным кодом теперь кажутся странными.   -  person philippe lhardy    schedule 17.11.2014


Ответы (2)


Решение с использованием генераторов:

grid = [[0,0,0,0],
        [0,1,0,0],
        [0,0,1,0],
        [0,0,0,0]]

def search(sr, sc, er, ec, path):

    if sr < 0 or sc < 0 or sr >= len(grid) or sc >= len(grid[0]):
        return
    if (sr, sc) in path or grid[sr][sc] == 1:
        return

    path.append((sr, sc))
    if (sr, sc) == (er, ec):
        yield path
    else:
        for possible_path in search(sr+1, sc, er, ec, list(path)):
            yield possible_path
        for possible_path in search(sr-1, sc, er, ec, list(path)):
            yield possible_path
        for possible_path in search(sr, sc+1, er, ec, list(path)):
            yield possible_path
        for possible_path in search(sr, sc-1, er, ec, list(path)):
            yield possible_path

Если вы хотите перейти от (0,1) к (3,3):

print list(search(0, 1, 3, 3, []))

Выход:

[(0, 1), (0, 2), (1, 2), (1, 3), (2, 3), (3, 3)]
[(0, 1), (0, 2), (0, 3), (1, 3), (2, 3), (3, 3)]
[(0, 1), (0, 0), (1, 0), (2, 0), (3, 0), (3, 1), (3, 2), (3, 3)]
[(0, 1), (0, 0), (1, 0), (2, 0), (2, 1), (3, 1), (3, 2), (3, 3)]
person Yoann Quenach de Quivillic    schedule 14.11.2013
comment
Рекурсивный генератор, нравится! - person Vincent; 15.11.2013

Вставьте

grid[sx][sy] = 0

когда вы снова удаляете [sx, sy] из пути (т. е. прямо перед return), чтобы пометить эту ячейку как не посещенную снова.

Кроме того, вы можете изменить строку

solution.append(path)

to

solution.append(path[:])

чтобы создать копию этого решения, чтобы сохранить ее на потом. Без [:] вы просто добавляете еще одну ссылку к тому же списку, который позже будет изменен в процессе, так что вы получите список пустых списков в solution.

И вам следует подумать о том, чтобы не использовать глобальные переменные. Я думаю, что yield каждое найденное решение из генератора будет гораздо приятнее, чем добавлять его в глобальную переменную. Но это другой аспект, и здесь он немного выходит за рамки.

person Alfe    schedule 14.11.2013