Maze solving with python

后端 未结 2 2015
小蘑菇
小蘑菇 2020-12-18 00:36

I am trying to make a maze solver, and it is working except that instead of the path being marked by \"o\" I want it to be marked with \">\", \"<\", \"v\", \"^\" dependin

相关标签:
2条回答
  • 2020-12-18 00:42

    I would suggest that instead of setting the value to 'o' immediately and returning 'True' you use if ... elif to set the character and then return.

    @marqs pointed out that my original answer would have allowed the recursion to revisit a position that had already been proven false. As a result, mark all positions with 'o' so that they cannot be revisited and later loop through and reset all 'o' as ' '

    Note that I am suggesting if ... elif since four separate if's will always check the other possibilities even though they would have been proven false by already finding the true path.

    # 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 != ' ')
    

    This will cause the attempted (false) path to fill up with 'o' and then back up to blank when it is shown as untrue.

    Alternatively, you can leave it with a 'o' in it and after the true path has been found, go back over the entire maze and clear thos points marked with 'o'

    If this is the case remove the else: and change the return to

    return (tag != 'o')
    
    0 讨论(0)
  • 2020-12-18 00:45
    #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
    ...
    

    From Lix example. You need to uncomment maze[y][x] = "o", you need that row to prevent the node from being revisited

    0 讨论(0)
提交回复
热议问题