Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 宽度优先的迷宫发生器不';t生成";“可解迷宫”;_Python_Generator_Breadth First Search_Maze - Fatal编程技术网

Python 宽度优先的迷宫发生器不';t生成";“可解迷宫”;

Python 宽度优先的迷宫发生器不';t生成";“可解迷宫”;,python,generator,breadth-first-search,maze,Python,Generator,Breadth First Search,Maze,我一直在做一个需要随机生成迷宫的项目。在阅读了关于它的文章之后,我决定使用基于所提供的算法的广度搜索优先算法。不幸的是,在对GUI绘图进行了一些测试之后,我注意到有时生成的迷宫无法“解决”,即无法绘制从起始单元格到“最终单元格”的路径。更准确地说,wiki中描述的广度优先搜索算法实际上并不能解释终点!我现在才意识到这一点,我想知道是否有办法解决这个问题 总体问题:在广度优先搜索迷宫生成算法中,是否有办法确保从指定的起始单元格(本例中为[0,0])到指定的结束单元格(比如[x,y])的路径 这是p

我一直在做一个需要随机生成迷宫的项目。在阅读了关于它的文章之后,我决定使用基于所提供的算法的广度搜索优先算法。不幸的是,在对GUI绘图进行了一些测试之后,我注意到有时生成的迷宫无法“解决”,即无法绘制从起始单元格到“最终单元格”的路径。更准确地说,wiki中描述的广度优先搜索算法实际上并不能解释终点!我现在才意识到这一点,我想知道是否有办法解决这个问题

总体问题:在广度优先搜索迷宫生成算法中,是否有办法确保从指定的起始单元格(本例中为[0,0])到指定的结束单元格(比如[x,y])的路径

这是python源代码(正如您所看到的,它不考虑结束单元格)


大部分代码都是不言自明的(与维基百科的伪代码类似)。需要注意的是,位置(x,y)实际上是标量,在画布绘制代码中,它乘以迷宫单元的实际宽度

尝试在该wiki页面上查找Primm或Kruskal的算法。@alecbenzer这些算法能保证从指定的起点(0,0)到达指定的终点(x,y)吗?我仔细阅读了这些,但我并没有真正看到任何东西在广度优先搜索方面将它们区分开来。在我看来,你的算法将“访问”网格的每个单元。。。所以每个细胞从一开始就应该是可以到达的,不是吗?为什么不呢?编辑:啊,
get\u rand\u loc(已访问)
返回一个曾经访问过或没有访问过的随机单元格?我认为它应该返回一个随机的已经访问过的单元,否则它确实会启动一个断开连接的组件。
def gen_maze(self):
    current_loc = (0,0) #initial cell is (0,0)
    visited = set([(0,0)])
    stack = []

    while len(visited) != len(self.grid):
        neighbours = self.get_neighbours(current_loc, visited)

        if neighbours != set():
            neighbour = unlist(random.sample(neighbours, 1)) 
            stack += [current_loc] 
            self.remove_wall_btwn(current_loc, neighbour)
            current_loc = neighbour
            visited.add(current_loc)
        elif stack != []:
            current_loc = stack.pop()
        else:
            current_loc = self.get_rand_loc(visited)
            visited.add(current_loc)