Java递归问题迷宫

Java递归问题迷宫,java,Java,我对Java相当陌生,正在尝试用递归解决迷宫。我在下面添加了部分代码。我有一个包含“字段”的二维数组。墙为1,给出了起点坐标和终点坐标 我有一个问题 每当路径无法继续时,我想擦除路径的位置&未到达终点。我该怎么做 我试着为它添加布尔值 在递归结束时添加迷宫[x][y]=“0”(空) 但我还没弄明白,也许我做错了 PS:我在论坛上搜索过,读过很多关于递归的书,还有其他人是如何解决他们的问题的,但是我不知道如何修复这些代码 -p代表路径 -宽度和高度来自2D阵列, -我从开始导航(xstart,

我对Java相当陌生,正在尝试用递归解决迷宫。我在下面添加了部分代码。我有一个包含“字段”的二维数组。墙为1,给出了起点坐标和终点坐标

我有一个问题

每当路径无法继续时,我想擦除路径的位置&未到达终点。我该怎么做

  • 我试着为它添加布尔值
  • 在递归结束时添加迷宫[x][y]=“0”(空)
但我还没弄明白,也许我做错了

PS:我在论坛上搜索过,读过很多关于递归的书,还有其他人是如何解决他们的问题的,但是我不知道如何修复这些代码

-p代表路径 -宽度和高度来自2D阵列, -我从开始导航(xstart,ystart)开始(这就是为什么每当它找到B(开始)时我需要尝试新的位置)


导航(整数x,整数y){

if(x<0 | | x>宽度-1 | | y<0 | | y>高度-1){
返回;
}
如果(迷宫[x][y]='1'){
返回;
}
如果(迷宫[x][y]='E'){
迷宫[x][y]=“P';
}
如果(迷宫[x][y]='P'){
返回;
}
如果(迷宫[x][y]='0'){
迷宫[x][y]=“P';
返回;
}
如果(迷宫[x][y]=='B'){
迷宫[x][y]=“P';
导航(x+1,y);
导航(x,y+1);
导航(x-1,y);
导航(x,y-1);
返回;
}
迷宫[x][y]=“P';
导航(x+1,y);
导航(x,y+1);
导航(x-1,y);
导航(x,y-1);
}

我要把我为它所做的事情写下来。虽然已经有一段时间了,但是任何人读到它都会觉得很有帮助


我刚刚创建了数组和这些数组的数组。在存储每个路径的地方,只需选择一个最大值,但在理想情况下,您应该为它指定长度行*列(因为这是最大长度)。您可以在找到结束后创建一个。

尝试添加一个包含特定递归所具有位置的ArrayList,然后在点击“O”后遍历ArrayList,并将其上的每个位置都设为“F”作为最终路径。然后,在方法结束时,清除所有“p”(可能通过遍历2D数组的每个元素)在末尾,有一条或多条由F表示的路径将您引到终点


我假设“O”是您的结束位置。

您需要的唯一标记是:

1 - wall
0 - empty (can use for path)
P - path
现在,让我们从起点开始导航:

navigate(xstart, ystart);
我们如何导航

navigate(int x, int y) {

    // Are we there yet?
    if (x == xend && y == yend) {
        // Yay! We're here! And our path is marked with P's
        // However, you're many levels inside the recursion. How to break out?
        // Easiest way - throw an exception, and catch in the original caller
    }

    // Don't step where you're not supposed to
    if (x < 0 || x > width - 1 || y < 0 || y > height - 1) {
        return;
    }
    if (maze[x][y] == '1' || maze[x][y] == 'p') {
        return;
    }

    // OK, we can step through here. Let's mark this place as path
    maze[x][y] = 'P';

    // Now, let's try continuing to neighboring squares
    navigate(x + 1, y);
    navigate(x, y + 1);
    navigate(x - 1, y);
    navigate(x, y - 1);

    // If we're still here, guess this square is not on the path - remove it
    maze[x][y] = '0';
}
导航(整数x,整数y){
//我们到了吗?
如果(x==xend&&y==yend){
//耶!我们到了!我们的路径用P标记
//然而,递归中有很多层次,如何突破?
//最简单的方法-抛出异常,并捕获原始调用方
}
//不要走你不该走的地方
如果(x<0 | | x>宽度-1 | | y<0 | | y>高度-1){
返回;
}
如果(迷宫[x][y]='1'| |迷宫[x][y]=='p'){
返回;
}
//好的,我们可以从这里通过。让我们把这个地方标记为路径
迷宫[x][y]=“P';
//现在,让我们继续看邻近的广场
导航(x+1,y);
导航(x,y+1);
导航(x-1,y);
导航(x,y-1);
//如果我们还在这里,猜测这个方块不在路径上-移除它
迷宫[x][y]=“0”;
}
(警告:我还没有测试代码,我是一名C#程序员,但应该是一样的)

趣味测试:

  • 如果更改递归
    navigate()
    调用的顺序,会发生什么情况
  • 如果只有很少的墙怎么办?这个算法将如何使用空间

递归很有趣!你可以得到一个实际的Sack溢出!

谢谢你的回答,我的想法与你发布的内容完全相同,尽管出于某种原因它没有起到作用:/I我想我必须添加一些额外的数组,如Rufus所说的“保存”通过/检查的坐标。我认为如果你为你的问题添加一个样本测试用例,你会得到更好的答案。如果某人的想法有效,请接受他们的答案,这样问题就不会一直没有答案。或者,如果没有,请告诉他们
navigate(int x, int y) {

    // Are we there yet?
    if (x == xend && y == yend) {
        // Yay! We're here! And our path is marked with P's
        // However, you're many levels inside the recursion. How to break out?
        // Easiest way - throw an exception, and catch in the original caller
    }

    // Don't step where you're not supposed to
    if (x < 0 || x > width - 1 || y < 0 || y > height - 1) {
        return;
    }
    if (maze[x][y] == '1' || maze[x][y] == 'p') {
        return;
    }

    // OK, we can step through here. Let's mark this place as path
    maze[x][y] = 'P';

    // Now, let's try continuing to neighboring squares
    navigate(x + 1, y);
    navigate(x, y + 1);
    navigate(x - 1, y);
    navigate(x, y - 1);

    // If we're still here, guess this square is not on the path - remove it
    maze[x][y] = '0';
}