Recursion 回溯迷宫算法不';I don’我好像一路往回走

Recursion 回溯迷宫算法不';I don’我好像一路往回走,recursion,stack,backtracking,maze,Recursion,Stack,Backtracking,Maze,基本上,我有这样一个:首先,一堆代码生成一个不可遍历的迷宫。它基于几个参数在二维阵列的特定空间中随机设置墙。然后,我有一个回溯算法,通过它来敲打墙壁,直到整个东西都可以通过。问题是,程序似乎并没有完全回到堆栈中 这是相当标准的回溯代码。该算法从随机位置开始,然后以伪码进行: 移动(x,y){ 如果你能上去但还没有去过那里: 移动(x,y-1) 如果您可以向右走,但还没有去过那里: 移动(x+1,y) … } 其他方向也是如此。每次移动时,都会在坐标处设置两个独立的二维布尔数组(一个临时数组,一个

基本上,我有这样一个:首先,一堆代码生成一个不可遍历的迷宫。它基于几个参数在二维阵列的特定空间中随机设置墙。然后,我有一个回溯算法,通过它来敲打墙壁,直到整个东西都可以通过。问题是,程序似乎并没有完全回到堆栈中

这是相当标准的回溯代码。该算法从随机位置开始,然后以伪码进行:

移动(x,y){
如果你能上去但还没有去过那里:
移动(x,y-1)
如果您可以向右走,但还没有去过那里:
移动(x+1,y)

}

其他方向也是如此。每次移动时,都会在坐标处设置两个独立的二维布尔数组(一个临时数组,一个永久数组),以显示您已在某个元素中。一旦无法继续,它会检查永久2D阵列,看看它是否无处不在。如果没有,它将随机拾取一堵位于已访问空间和未访问空间之间的墙(根据临时阵列),并将其移除。整个过程在while循环中调用,因此一旦它遍历了迷宫的一块,临时2D数组将被重置,而另一个数组将被保留,并在另一个随机位置再次遍历,直到永久2D数组显示整个迷宫已被遍历。移动方法中的检入将与临时二维阵列(而不是永久阵列)进行比较

这几乎奏效了,但我一直在最终生成的迷宫中找到一些无法到达的区域。否则,它会按照我想要的方式生成一个迷宫。问题是,我发现这样做的原因是它不会一直回到堆栈中

如果我将其更改为检查临时2D数组是否完成而不是永久数组(从而使其在一次运行中执行一次完整遍历以标记其完成,而不是在多次迭代中执行完整运行),它将继续进行下去。我必须设置一个计数器来打破它。结果是一个“迷宫”,移除了太多太多的墙。检查算法所走的路线,我发现它没有正确地回溯,也没有在堆栈中返回到足够远的位置,经常只是在一个元素上停留几十次递归,然后毫无理由地声明自己已完成,并移除一堵需要移除的零墙


我已经试过两次运行前面的一个,但是它不断地推倒不需要推倒的墙,使迷宫变得太稀疏。我不知道为什么会发生这种情况。

我在尝试创建迷宫的方法时遇到了类似的问题。 制作迷宫时,重要的是不要在迷宫中创建由相连房间组成的孤立“岛”。这是我的伪代码解决方案

Room r=randomRoom();

while(r!=null){
    recursivelyDigNewDoors(r);
    r=null;
    for(i=0;i<rooms.count;i++){
        if(rooms[i].doors.length == 0 && rooms[i].hasNeighborWithDoor() ){ 
        //if there is a room with no doors and that has a neighbor with doors
        Create a door between the doorless room and the one 
        connected to the rest of your maze
        r=rooms[i];
        }
   }
}
Room r=randomRoom();
while(r!=null){
递归DigNewdoors(r);
r=null;

对于(i=0;i我在尝试创建迷宫的方法时遇到了类似的问题。 制作迷宫时,重要的是不要在迷宫中创建由相连房间组成的孤立“岛”

Room r=randomRoom();

while(r!=null){
    recursivelyDigNewDoors(r);
    r=null;
    for(i=0;i<rooms.count;i++){
        if(rooms[i].doors.length == 0 && rooms[i].hasNeighborWithDoor() ){ 
        //if there is a room with no doors and that has a neighbor with doors
        Create a door between the doorless room and the one 
        connected to the rest of your maze
        r=rooms[i];
        }
   }
}
Room r=randomRoom();
while(r!=null){
递归DigNewdoors(r);
r=null;

对于(i=0;iThanks,但我明白了。愚蠢的我没有考虑确保方法上有一个返回值,并且返回值被分配给每个递归。难怪它不起作用。我没有告诉它维护一个堆栈以进行返回!几个小的更改,我现在有了一个迷宫生成算法,该算法可以正常工作从一个由1x1正方形组成的纯网格到一个人烟稀少的网格,任何配置都非常好。我得到了一个非常非线性的迷宫,但仍然需要大量的遍历才能通过。谢谢!谢谢,但我找到了答案。愚蠢的我没有考虑确保方法上有返回值,并且返回值是正确的分配给每个递归。难怪它不起作用。我没有告诉它维护一个堆栈以返回!几个小的更改,我现在有了一个迷宫生成算法,它在从1x1正方形的纯网格到稀疏填充的任何配置中都能令人惊讶地很好地工作。我得到了一个非常非线性的迷宫,但它仍然存在ll需要大量的遍历才能通过。不过谢谢!