Python - 深度第一个迷宫求解器

时间:2012-11-24 00:46:09

标签: python maze

我在python中做了一个功课,我应该让一个“机器人”从开始到结束,并返回到目标的路径。我有机器人搜索,但我希望列表只显示从头到尾的路径。现在,pathList返回所有访问过的方块..而且,当它达到目标时它不会停止,只需继续其他节点。 我错过了什么?

def find(labyrinth, robotPos, pathList = []):

    frontier = adjacent_passages(labyrinth, robotPos)   
    pathList.append(robotPos)

    if len(frontier) == 1:
        print("Corner")
        return []

    for i in range(0, len(frontier)):
        if frontier[i] == goal:
            pathList.append(frontier[i])
            return pathList

    for i in range(0, len(frontier)):
        if frontier[i] not in pathList:
            pathList.append(frontier[i])
            if (find(labyrinth, frontier[i], pathList) == []):
                pathList.pop()

    return pathList

2 个答案:

答案 0 :(得分:2)

我不知道这是否是您问题的答案,但我注意到的第一件事是您不应该使用列表作为默认函数参数(pathList = [])。 / p>

请参阅"Least Astonishment" and the Mutable Default Argument

答案 1 :(得分:2)

即使搜索失败,您append robotPos pathList if (find(labyrinth, frontier[i], pathList + [frontier[i]]) == [])... 而不删除它,这就是列表包含所有访问过的位置的原因。我建议完全避免列表突变(追加/弹出),而是将新值作为参数传递给下一次迭代:

robotPos

其他可能的简化是:

  • drop path。让当前位置成为for x in stuff参数
  • 的最后一项
  • 使用一个循环而不是两个
  • 在循环中,使用for i in range(0, len(stuff))代替def find(path): if path[-1] == goal: return path for new_position in adjacent_positions(path[-1]): if new_position not in path: found_path = find(path + [new_position]) if found_path: return found_path return None

这样的东西
{{1}}