我希望在迷宫中找到从开始到终点的独特可能路径 我已经编写了代码,但它只给了我迷宫中的一些路径......我想要所有路径 请提出一些建议
答案 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
每个从生成器找到的解决方案比将其附加到全局变量要好得多。但这是一个不同的方面,有点超出范围。