Python迷宫解决程序:如何标记正确的路径

Python迷宫解决程序:如何标记正确的路径,python,recursion,maze,Python,Recursion,Maze,我写了一个递归求解迷宫的程序。它打开一个包含迷宫的文本文件,将其转换为列表列表,然后尝试递归求解。 以下是解决迷宫的部分: def search(x,y, mazeList): # returns True if it has found end of maze if mazeList[x][y] == 'E': return True # returns False if it encounters a wall elif mazeList[x]

我写了一个递归求解迷宫的程序。它打开一个包含迷宫的文本文件,将其转换为列表列表,然后尝试递归求解。 以下是解决迷宫的部分:

def search(x,y, mazeList):
    # returns True if it has found end of maze
    if mazeList[x][y] == 'E':
        return True
    # returns False if it encounters a wall
    elif mazeList[x][y] == '-':
        return False
    elif mazeList[x][y] == '+':
        return False
    elif mazeList[x][y] == "|":
        return False
    # returns False if it finds a visited path
    elif mazeList[x][y] == '*':
        return False
    # marks path with '*'
    mazeList[x][y] = '*'

    # recursive search        
    if ((search(x+1, y, mazeList))
        or (search(x, y-1, mazeList))
        or (search(x-1, y, mazeList))
        or (search(x, y+1, mazeList))):
        return True
    return False
在迷宫中,“-”、“+”和“|”构成了迷宫的墙壁,可以在空白处导航,“E”是迷宫的终点。它从迷宫的左下角开始,然后从那里开始。我希望正确的路径用*标记,但是它用*标记它所走的每一条路径,即使它是从错误的路径返回


因此,我如何编辑代码,以便在最后,只有从开始到结束的正确路径被标记为*

您可以尝试使用不同于用于创建访问路径的“*”的符号重新写入“返回途中”的路径

示例:替换

if mazeList[x][y] == 'E':
        return True


希望路径将用o写。虽然未测试,但您可以尝试使用不同于用于创建访问路径的“*”的符号重新写入“返回途中”路径

示例:替换

if mazeList[x][y] == 'E':
        return True


希望路径将用o写。虽然未测试它

简而言之,只要
返回True,就将单元格标记为属于正确路径。你必须用星星以外的东西来标记它。此外,一旦你找到了一个能让你实现梦想的方向,不要尝试其他方向。(更新:Python确实支持短路布尔求值,但以下代码不依赖它。)。所以你可以写一些像:

dx = [1, -1, 0, 0]   # better define dx and dy globally 
dy = [0, 0, 1, -1]
for i in range(4):
  if search(x+dx[i], y+dy[i], mazeList):
    mazeList[x][y] = '!'
    return True
return False
第一部分可以更加简洁:

  if mazeList[x][y] == 'E':
    return True
  elif mazeList[x][y] != ' ':
    return False
  else:
或者,您可以在['+','-']
中使用
mazeList[x][y]


一般来说,当你在做某种类型的计算时,你会在递归函数的末尾打印出正确的答案,当你回溯时,而不是当你第一次输入时,因为你事先不知道哪个方向是正确的。同样适用于在图形中查找和打印Euler循环(如果有)。

简而言之,只要
返回True,就将单元格标记为属于正确路径。你必须用星星以外的东西来标记它。此外,一旦你找到了一个能让你实现梦想的方向,不要尝试其他方向。(更新:Python确实支持短路布尔求值,但以下代码不依赖它。)。所以你可以写一些像:

dx = [1, -1, 0, 0]   # better define dx and dy globally 
dy = [0, 0, 1, -1]
for i in range(4):
  if search(x+dx[i], y+dy[i], mazeList):
    mazeList[x][y] = '!'
    return True
return False
第一部分可以更加简洁:

  if mazeList[x][y] == 'E':
    return True
  elif mazeList[x][y] != ' ':
    return False
  else:
或者,您可以在['+','-']
中使用
mazeList[x][y]

一般来说,当你在做某种类型的计算时,你会在递归函数的末尾打印出正确的答案,当你回溯时,而不是当你第一次输入时,因为你事先不知道哪个方向是正确的。这一点同样适用于在图形中查找和打印Euler循环(如果有)。

或者“取消标记”路径,您可以尝试这样做:而不是只返回
True
False
,返回您找到的路径,然后使用另一种方法绘制标记

当您找到
“E”
时,只需返回
[(x,y)]
。然后,您的递归搜索可能如下所示:

for (dx,dy) in [(+1,0), (-1,0), (0,+1), (0,-1)]:
    path = search(x+dx, y+dy, mazeList)
    if path: # path is a (non-empty) list
        return [(x, y)] + path
随着递归调用的返回,这将逐步构建并返回到目标的路径,从目标到开始

当然,由于您依赖被标记的路径来避免重访以前的位置,因此您需要一些其他方法,例如,对以前访问过的位置进行全局设置

还要注意的是,您的算法是深度优先搜索,因此不会找到最短的路径,而是任何通往目标的路径。为此,使用a可能更好,但这需要对代码进行一些重大重组,使用队列而不是递归来实现。

或者,要“取消标记”路径,您可以尝试以下操作:返回找到的路径,而不是只返回
True
False
,然后用另一种方法画出标记

当您找到
“E”
时,只需返回
[(x,y)]
。然后,您的递归搜索可能如下所示:

for (dx,dy) in [(+1,0), (-1,0), (0,+1), (0,-1)]:
    path = search(x+dx, y+dy, mazeList)
    if path: # path is a (non-empty) list
        return [(x, y)] + path
随着递归调用的返回,这将逐步构建并返回到目标的路径,从目标到开始

当然,由于您依赖被标记的路径来避免重访以前的位置,因此您需要一些其他方法,例如,对以前访问过的位置进行全局设置


还要注意的是,您的算法是深度优先搜索,因此不会找到最短的路径,而是任何通往目标的路径。为此,使用a可能更好,但这将需要对代码进行一些重大重组,使用队列而不是递归来实现。

请先修复缩进@对不起,现在都修好了。请先修好你的缩进@对不起,现在都修好了,这是正确的。它依赖于Python执行短路布尔求值的事实,因此一旦其中一个搜索返回
True
,就不会调用其他搜索。(否则您将标记多个正确路径。)此外,不需要在字母
E
上标记。这是正确的。它依赖于Python执行短路布尔求值的事实,因此一旦其中一个搜索返回
True
,就不会调用其他搜索。(否则您将标记多个正确路径。)此外,不需要在字母
E
上进行标记。