用python解决迷宫

时间:2014-03-27 22:00:36

标签: python recursion maze

我正在尝试制作一个迷宫求解器,它正在工作,除了用“o”标记的路径,我希望它标有“>”,“<”,“v”,“ ^“取决于路径的方向。这是它解决迷宫的代码的一部分:

 def solve(self,x,y):
    maze = self.maze

    #Base case  
    if y > len(maze) or x > len(maze[y]):
        return False

    if maze[y][x] == "E":
        return True 

    if  maze[y][x] != " ":
        return False


    #marking
    maze[y][x] = "o"        

    #recursive case
    if self.solve(x+1,y) == True :  #right
        return True
    if self.solve(x,y+1) == True :  #down
        return True     
    if self.solve(x-1,y) == True :  #left
        return True     
    if self.solve(x,y-1) == True :  #up
        return True     

    #Backtracking
    maze[y][x] = " "
    return False    

这是一个未解决的迷宫的例子:

####################################
#S#  ##  ######## # #      #     # #
# #   #             # #        #   #
#   # ##### ## ###### # #######  # #
### # ##    ##      # # #     #### #
#   #    #  #######   #   ###    #E#
####################################

这是使用上述代码的相同迷宫的解决版本:

####################################
#S#  ##  ######## # #oooooo#  ooo# #
#o#ooo#    oooo     #o#   ooooo#ooo#
#ooo#o#####o##o######o# #######  #o#
### #o##oooo##oooooo#o# #     ####o#
#   #oooo#  #######ooo#   ###    #E#
####################################

我想要的结果是:

####################################
#S#  ##  ######## # #>>>>>v#  ^>v# #
#v#^>v#    >>>v     #^#   >>>>^#>>v#
#>>^#v#####^##v######^# #######  #v#
### #v##^>>^##>>>>>v#^# #     ####v#
#   #>>>^#  #######>>^#   ###    #E#
####################################

怎么可能这样做?

2 个答案:

答案 0 :(得分:4)

#marking
maze[y][x] = "o"        

#recursive case
if self.solve(x+1,y) == True :  #right
    maze[y][x] = ">"
    return True
if self.solve(x,y+1) == True :  #down
    maze[y][x] = "v"
    return True
...

来自Lix的例子。您需要取消注释迷宫[y] [x] =“o”,您需要该行以防止重新访问该节点

答案 1 :(得分:1)

我建议不要立即将值设置为'o'并返回'True',而是使用if ... elif设置字符然后返回。

@marqs指出,我的原始答案将允许递归重新访问已被证明为假的位置。结果,用'o'标记所有位置,以便不能重新访问它们,然后循环并将所有'o'重置为''

请注意,我建议如果...... elif,因为四个单独的if会一直检查其他可能性,即使它们已经被证明是错误的已经找到了真正的路径。

# tag = ' '  Mistake on my part
tag = 'o' # Mark so will not be revisited
maze[y, x] = tag # Mark maze point as handled
if self.solve(x+1,y) == True :  #right
    tag = '>'
elif self.solve(x,y+1) == True :  #down
    tag = 'v'     
elif self.solve(x-1,y) == True :  #left
    tag = '<'     
elif self.solve(x,y-1) == True :  #up
    tag = '^'
else:
  # All possible paths from here are false, back up and clear this point.
  tag = ' '
# Note that if none of the tests were true, tag is left as ' '
maze[y, x] = tag # Note C or C++ would use [x, y]
return (tag != ' ')

这将导致尝试(错误)路径填充“o”,然后在显示为不真实时返回空白。

或者,您可以在其中留下“o”并在找到真正的路径后,返回整个迷宫并清除标有“o”的点

如果是这种情况,请删除else:并将返回更改为

return (tag != 'o')