迷宫求解器不会在Python中回溯

时间:2019-05-12 23:48:05

标签: python-3.x

有几个与此类似的迷宫问题,但没有一个真正涉及为什么它不起作用的问题。

我不需要确切的答案。我只需要知道为什么这个特殊的东西不起作用。

这是我需要帮助的班级迷宫中的一部分。

    在我的示例中,
  • ysize是10
  • xsize是10
  • xend是20(将结果更改为19,并且没有绘制任何内容)
  • yend是10(将其更改为9也是如此)
class Maze:
    def __init__(self):
        self.maze = []
        self.xstart = None
        self.ystart = None
        self.xend = None
        self.yend = None
        self.xsize = None
        self.ysize = None



    def read_maze(self, filename):
        maze_list = []

        f_maze = open(filename)

        size = f_maze.readline().split()                # 
        start = f_maze.readline().split()               # 
        end = f_maze.readline().split()                 # 

        self.xstart = int(start[1])
        self.ystart = int(start[0])

        self.xend = (int(end[1])*2)
        self.yend = (int(end[0])*2)


        self.xsize = (int(size[1])*2)
        self.ysize = (int(size[0])*2)

        lines = f_maze.readlines()

        for line in lines:
            maze_list.append(list(line[:len(line)]))

        self.maze = maze_list                           # Assigns to class

    def __str__(self):
        return ("".join(''.join(line) for line in self.maze))
    def solve(self, x, y):        

        if y > (self.ysize) or x > (self.xsize):
            print("1")
            return False

        if self.maze[y][x] == self.maze[self.yend][self.xend]:
            print("2")
            return True 

        if self.maze[y][x] != " ":
            print("3")
            return False

        self.maze[y][x] = "o" # MARKING WITH o for path already taken.

        if self.solve(x+1,y) == True:  

            return True
        elif self.solve(x,y+1) == True: 

            return True
        elif self.solve(x-1,y) == True:

            return True
        elif self.solve(x,y-1) == True: 

            return True

        self.maze[y][x] = " " # ELSE I want it to be replaced with space

        return False

这是当前结果。

 ---------------------
 |ooooooooooooo| |   |
 |-+-+-+ +-+-+o+ + +-|
 |   |   |   |o|     |
 | +-+-+ + +-+-+-+ + |
 |       | | |     | |
 |-+-+ + + + +-+ +-+-|
 |     |             |
 |-+ +-+-+-+-+-+ +-+ |
 |     |         |   |
 ---------------------

我想要这样:

---------------------
|ooooooo      | |   |
|-+-+-+o+-+-+ + + +-|
|   |  o|   | |     |
| +-+-+o+ +-+-+-+ + |
|      o| | |     | |
|-+-+ +o+ + +-+ +-+-|
|     |ooooooooooooo|
|-+ +-+-+-+-+-+ +-+o|
|     |         |  o|
---------------------

我很抱歉在这里无法解决缩进格式。那是我的全部代码。这些是我的测试语句:

maze = Maze()
maze.read_maze(filename)
maze.solve(maze.xstart, maze.ystart)
print(maze)

文件以这种格式保存为.txt文件。

 5 10
 1 1
 5 10
 ---------------------
 |             | |   |
 |-+-+-+ +-+-+ + + +-|
 |   |   |   | |     |
 | +-+-+ + +-+-+-+ + |
 |       | | |     | |
 |-+-+ + + + +-+ +-+-|
 |     |             |
 |-+ +-+-+-+-+-+ +-+ |
 |     |         |   |
 ---------------------

1 个答案:

答案 0 :(得分:1)

问题在于,当文件站立时,xend, yend(10, 20)。要调试为什么它不起作用,您可以print(self.maze[self.yend][self.xend])返回破折号"-"。现在,当递归调用的(x, y)对达到第一个破折号时,它将测试True的行

if self.maze[y][x] == self.maze[self.yend][self.xend]:

并认为它已经解决了迷宫问题。相反,我们要测试

if (y, x) == (self.yend, self.xend):

也就是说,测试坐标,而不是平方的值。

另一点:检查目标的实际位置,我们看到它在这里:

+-+ +-+ |
    |   |
--------- <= this corner is the goal!

如果严格按照基本方向移动,将无法到达。将目标向上或向左移动一个正方形会将其置于求解器算法的范围之内。

这足以使代码对我有用,并且希望足以使您再次行动。