通过迷宫找到路径

时间:2013-11-14 12:11:54

标签: maze

我希望在迷宫中找到从开始到终点的独特可能路径 我已经编写了代码,但它只给了我迷宫中的一些路径......我想要所有路径 请提出一些建议

2 个答案:

答案 0 :(得分:3)

使用生成器的解决方案:

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)]

答案 1 :(得分:0)

插入

grid[sx][sy] = 0

当您再次从路径中移除[sx, sy]时(即在return之前),以便将该单元格标记为未再次访问。

此外,您可能想要更改行

solution.append(path)

solution.append(path[:])

创建该解决方案的副本,以便以后保留。如果没有[:],您只需添加对同一列表的另一个引用,该列表稍后会在此过程中更改,这样您最终会在solution中找到一个空列表列表。

AND 你应该考虑不使用全局变量。我认为yield每个从生成器找到的解决方案比将其附加到全局变量要好得多。但这是一个不同的方面,有点超出范围。