【问题标题】:Backtracking to find the maze exit. Why does my function always return True?回溯寻找迷宫出口。为什么我的函数总是返回 True?
【发布时间】:2020-07-17 19:21:03
【问题描述】:

我的代码成功通过了迷宫中所有可能的路径...但它总是返回True,即使只有在满足某些条件时才会更新 true(已经到达边缘迷宫)。 看来我对范围有误解。这是我第一次使用 global 关键字。

这是一些示例输入/输出。上面是迷宫,两个数字是迷宫中当前位置的(x,y)坐标。 'k' 是起始位置,'#' 是墙

# # ## #
# #k#  #
# # # ##
# # #  #
#     ##
########
3 2
3 3
3 4
3 5
4 5
5 5
5 4
6 4
5 3
5 2
6 2
6 1
2 5
1 5
1 4
1 3
1 2
1 1
3 1
True
found = False
def find_start(maze):
    start = None
    for i in range(len(maze)):
        print(maze[i])
        for j in range(len(maze[i])):
            if maze[i][j] == 'k':
                if start == None:
                    start = (i, j)
                else:
                    raise "There should be no multiple Kates"
    if not start:
        raise "There should be one Kate"
    return start

def has_exit(maze):
    visited = [[False for _ in range(len(maze[i]))] for i in range(len(maze))]
    y, x = find_start(maze)
    def backtrack(maze, x, y):
        visited[y][x] = True
        print(x, y)
        if x == 0 or x == (len(maze[y]) - 1) or y == 0 or y == (len(maze) - 1) or x > len(maze[y+1]) - 1 or x > len(maze[y-1]) - 1: # This last condition is the hard one.
            print('Found edge')
            global found
            found = True
            return
        if maze[y][x+1] == ' ' and not visited[y][x+1]:
            backtrack(maze, x+1, y)
        if maze[y][x-1] == ' ' and not visited[y][x-1]:
            backtrack(maze, x-1, y)
        if maze[y+1][x] == ' ' and not visited[y+1][x]:
            backtrack(maze, x, y+1)
        if maze[y-1][x] == ' ' and not visited[y-1][x]:
            backtrack(maze, x, y-1)
        
    backtrack(maze, x, y)
    if found:
        print(found)
        return True
    else:
        print(found)
        return False

【问题讨论】:

  • 你用什么资源来学习 Python? raise "..."ages 之前已被弃用,在 Python 3 甚至 Python 2.7 中都是不合法的。
  • 另外,不要使用全局变量。有backtrack返回一个值。

标签: python scope global recursive-backtracking


【解决方案1】:

found 唯一被赋值的地方是第一次通过代码=False 然后每当代码命中backtrack 时,它就会分配它True。对于您的问题,重要的是,您永远不会重置found,因此一旦设置为True,它将永远不会重置。由于您在所有可能的路径上进行递归,因此您最终会遇到优势,因此 found=True 最终会用于任何运行。

我同意其他关于使用函数返回值的建议,但在这里你只需要为递归搜索适当地重置你的状态。

【讨论】:

    【解决方案2】:

    您还没有为您的代码提供进一步调试的起点。

    然而,Python 中全局关键字的基本规则是:

    • 当我们在函数内部创建变量时,默认是局部变量。
    • 当我们在函数之外定义一个变量时,它是全局的 默认。您不必使用全局关键字。
    • 我们使用全局关键字 在函数中读取和写入全局变量。
    • 使用全局 函数外的关键字无效。

    Source - 更多示例可在此来源中找到

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多