Python 检查完美迷宫输入的验证

Python 检查完美迷宫输入的验证,python,recursion,path-finding,maze,Python,Recursion,Path Finding,Maze,我正在做一个建造完美迷宫的项目。 我有一个类迷宫和一个表示迷宫中每个正方形的类单元格。在我的Cell类中,我有四个布尔变量(北、南、东、西)来表示在北还是南有墙。。一间牢房。还有一个名为visit的布尔变量,用于检查单元格是否已被访问。下面是我为Cell类初始化的代码 def __init__(self): self.north = True self.south = True self.east = True self.west = True self.

我正在做一个建造完美迷宫的项目。 我有一个类迷宫和一个表示迷宫中每个正方形的类单元格。在我的Cell类中,我有四个布尔变量(北、南、东、西)来表示在北还是南有墙。。一间牢房。还有一个名为visit的布尔变量,用于检查单元格是否已被访问。下面是我为Cell类初始化的代码

def __init__(self):
    self.north = True
    self.south = True
    self.east = True
    self.west = True
    self.visit = False
对于迷宫类,我有self.Maze(一堆细胞)和self.size=N(构建一个N*N的迷宫)。 下面是类迷宫的init():

def __init__(self, N):

    self.size = N
    self.maze = [[i for i in range(N + 2)] for i in range(N + 2)]

    for r in range(self.size + 2):
        for c in range(self.size + 2):
            self.maze[r][c] = Cell()
在更新maze的索引时,我编写了两个函数来检查newX和newY是否在Python中的1范围内,如果不指定另一个开始位置,则以0开始。因此,当您初始化迷宫时,在
(0,*)
(*,0)
中有单元格:

当你计算你的邻居时,你不会检查你是否没有出去:

neighbor = [(x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)]
只有在将
new
指定给这样一个坐标后,您才能检查它是否有效。但是,如果它无效并且没有邻居,那么您将再次调用
walk
。您应该独立于
访问
检查
范围内的

此外,您的循环只能运行一次,因为
new
是有效的,您可以跳出循环,或者它是无效的,您可以跳出循环


最后,您忘了给我们提供
search
函数和
s
是什么(而且
s.pop
看起来很有趣,因为
pop
的参数通常是一个索引,而不是序列)。

您可以通过仔细查看
walk()
找到这一点,或者用
print
语句对其进行飞溅以跟踪。 在网格的端点(当x或y==0或N-1时)出现问题。除非您允许wrapparound,否则我假设您的网格初始化将墙放置在网格的北部(y==0)、南部、东部和西部。 顺便说一句,您的网格有两个不必要的行和列:如果您想要N个单元格,编号为O..(N-1),那么使用
range(N)
,而不是
range(N+2)
,或者使用
range(1,N+1)
。(是否用valid==False填充任何不需要的单元格?)

无论如何,
walk()
首先选择一个随机的相邻单元,如果它是一个有效单元,则中断while循环。但如果不是,它会欣然挑选任何剩余的邻居单元(不管是否有效),并继续前进。那是你的错误。始终测试有效性。 如果它已经用完了有效的邻居单元,它将通过执行
s.pop(s)
进行回溯
s.pop
看起来也像一个bug。为什么不
s.pop()
? 顺便说一句,调用变量
path
,而不是
s

此外,这只是检查坐标的有效性;你从来没有真正检查过你是否访问过那个单元,所以递归回溯没有终止条件;你可以很容易地进行循环

如果将
walk()
重构为使用一个单独的生成器
get\u random\u valid\u neighbor()
,它返回随机选择的已测试为有效的邻居(当邻居用完时,
None


又是一周了吗?为什么到处都使用
范围(N+2)
?这将创建一个(N+1)x(N+1)迷宫。只需创建一个单元格。很高兴提供帮助。你能为迷宫和单元发布你的课程代码吗?如果s.size()==self.size**2:return
检查,那么什么是
?这是怎样的终止条件?除非你试图随机发现长度为N**2的路径(但它们不一定是循环或完全遍历),因为教授说要构建一个N+2迷宫来避免一些繁琐的问题。老实说,我也不知道原因。
def walk(self, s, x, y):

    neighbor = [(x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)]


    if s.size() == self.size**2: return

    else:

        while True:
            new = choice(neighbor)#choice() is import from random
            #print(self.is_valid(new[0], new[1]))
            if self.is_valid(new[0], new[1]):break
            else:
                if len(neighbor) != 0:
                    neighbor.remove(new)
                    new = choice(neighbor)
                else:
                    temp = s.pop(s)
                    self.walk(s, temp[0], temp[1])

                break
    print(new)
>>> ================================ RESTART 

================================
>>> 
>>> a = Maze(5)
>>> a.search()
1 2
(1, 3)
(2, 3)
(2, 4)
(1, 4)
(2, 4)
(2, 5)
(3, 5)
(4, 5)
(4, 4)
(4, 3)
(3, 3)
(3, 2)
(2, 2)
(2, 1)
(1, 1)
(0, 1)
(-1, 1)
(0, 1)
(1, 1)
(0, 1)
(-1, 1)
(-1, 2)
(-1, 1)
(0, 1)
for r in range(self.size + 2):
    for c in range(self.size + 2):
        self.maze[r][c] = Cell()
neighbor = [(x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)]
def walk(self, s, x, y):

...
      while True:
            new = choice(neighbor)
            if self.is_valid(new[0], new[1]):break # tested for validity
            else:
                if len(neighbor) != 0:
                    neighbor.remove(new)
                    new = choice(neighbor) # BUG: never tested for validity
                ...