Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.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
Java 递归迷宫遍历算法的问题_Java_Algorithm_Maze - Fatal编程技术网

Java 递归迷宫遍历算法的问题

Java 递归迷宫遍历算法的问题,java,algorithm,maze,Java,Algorithm,Maze,我的代码的目的是创建一个程序,该程序将在迷宫中读取数据,并将其存储到二维数组中,然后进行求解。我让程序读取迷宫并将其放入数组,但我的递归算法不起作用,这是我第三次尝试改变它以使其起作用。你能帮我把这件事做好吗 编辑:我发现了我原来的算法的问题,从某种意义上说,我得到了它来解决迷宫,但我遇到了另一个问题。程序没有打印出正确的内容。这也是出于我的好奇心。我已经找到了让它以另一种方式工作的方法 迷宫代码: public static boolean goNorth(){ boolea

我的代码的目的是创建一个程序,该程序将在迷宫中读取数据,并将其存储到二维数组中,然后进行求解。我让程序读取迷宫并将其放入数组,但我的递归算法不起作用,这是我第三次尝试改变它以使其起作用。你能帮我把这件事做好吗

编辑:我发现了我原来的算法的问题,从某种意义上说,我得到了它来解决迷宫,但我遇到了另一个问题。程序没有打印出正确的内容。这也是出于我的好奇心。我已经找到了让它以另一种方式工作的方法

迷宫代码:

 public static boolean goNorth(){
        boolean success;
        if (maze[currCol][currRow - 1] == maze[finishCol][finishRow]) {
            success = true;
            }
        if(maze[currCol][currRow - 1] == CLEAR){
            maze[currCol][currRow - 1] = PATH;
            currRow = currRow - 1;
            success = goNorth();
                if(!success){
                success = goWest();
                    if(!success){
                    success = goEast();
                        if(!success){
                            maze[currCol][currRow] = VISITED;
                            currRow = currRow + 1;
                            }
                        }
                    }
                    return success;
                } else {
                    return false;
            }
        }

    public static boolean goWest(){
        boolean success;
        if (maze[currCol - 1][currRow] == maze[finishCol][finishRow]) {
            success = true;
            }
        if(maze[currCol - 1][currRow] == CLEAR){
            maze[currCol - 1][currRow] = PATH;
            currCol = currCol - 1;
            success = goWest();
                if(!success){
                success = goSouth();
                    if(!success){
                    success = goNorth();
                        if(!success){
                            maze[currCol][currRow] = VISITED;
                            currCol = currCol + 1;
                            }
                        }
                    }
                    return success;
                } else {
                    return false;
            }
        }

        public static boolean goEast(){
        boolean success;
        if (maze[currCol + 1][currRow] == maze[finishCol][finishRow]) {
            success = true;
            }
        if(maze[currCol + 1][currRow] == CLEAR){
            maze[currCol + 1][currRow] = PATH;
            currCol = currCol + 1;
            success = goEast();
                if(!success){
                success = goNorth();
                    if(!success){
                    success = goSouth();
                        if(!success){
                            maze[currCol][currRow] = VISITED;
                            currCol = currCol - 1;
                            }
                        }
                    }
                    return success;
                } else {
                    return false;
            }
        }

        public static boolean goSouth(){
        boolean success;
        if (maze[currCol][currRow + 1] == maze[finishCol][finishRow]){
            success = true;
            }
        if(maze[currCol][currRow + 1] == CLEAR){
            maze[currCol][currRow + 1] = PATH;
            currRow = currRow + 1;
            success = goSouth();
                if(!success){
                success = goEast();
                    if(!success){
                    success = goWest();
                        if(!success){
                            maze[currCol][currRow] = VISITED;
                            currRow = currRow - 1;
                            }
                        }
                    }
                    return success;
                } else {
                    return false;
            }
        }

    }   
迷宫解算器代码:

public class SolveMaze1
{
    public static void main (String[] args)
    {
        Maze1 maze = new Maze1();
        maze.readMaze();
        maze.printMaze();
        maze.goNorth();
        maze.printMaze();
    }
}
预期结果:

xxxxxxxxxxxxxxxxxxFx
x     x       xxxx x
x xxxxx xxxxx   xx x
x xxxxx xxxxxxx xx x
x            xx xx x
x xxxxxxxxxx xx    x
xxxxxxxxxxxxSxxxxxxx

xxxxxxxxxxxxxxxxxxFx
xVVVVVxPPPPPPPxxxxPx
xVxxxxxPxxxxxPPPxxPx
xVxxxxxPxxxxxxxPxxPx
xVVVVVVPPPPPPxxPxxPx
xVxxxxxxxxxxPxxPPPPx
xxxxxxxxxxxxSxxxxxxx
我的结果:

    xxxxxxxxxxxxxxxxxxFx
    xVVVVVxVVVVVVVxxxxVx
    xVxxxxxVxxxxxVVVxxVx
    xVxxxxxVxxxxxxxVxxVx
    xVVVVVVVVVVVVxxVxxVx
    xVxxxxxxxxxxVxxVVVVx
    xxxxxxxxxxxxSxxxxxxx

评论中有很多好的建议;我会尽我所能总结它们

MePePeR的建议:使用一个方法调用 将您的单个
goXXXX()
调用转换为单个
go(dx,dy)
调用。如果您正试图处理递归(正如您的问题所示),那么您应该首先非常熟悉编写自己的方法。请注意,每个
goXXXX()
方法几乎相同,除了在每个方法中修改
currCol
currRow
变量。如果将更改量作为参数传递(即,
currCol
as
dx
的更改和
currRow
as
dy
),则可以反复使用相同的方法,只是给它不同的值。向东移动将是
go(1,0)
,向南移动将是
go(0,-1)
,等等

如果您对传递参数不太满意,请尝试一下,发布更新的代码,我们可以指导您解决遇到的问题

热舔的建议:使用调试器。 您已经使用
printMaze
方法迈出了第一步。如果您不是在IDE中开发(我刚开始学习时没有),那么调试器可能有点难以使用。在这种情况下,您需要简单地使用更多的
System.out.println
语句来获取有关代码执行的更多信息。如果您正在使用和IDE,请开始尝试调试器。一旦你开始玩它们,它们真的很容易使用。再一次,如果你陷入困境,请与我们交谈,我们可以帮助指导你

最后一个指针:注意迷宫打印输出有以下内容:

xVVx
PPVx
xPxx

既然你只能去北、南、东或西的自由空间,你怎么能在右上角得到一个
V
?这表明您的代码可能标记了错误的单元格,或者允许非法移动。

确定您的基本条件(case)。在本例中,基本情况可能是确定当前位置(x,y)是否大于天花板、小于地板、小于左墙还是大于右墙

接下来,您可能应该确定当前位置(x,y)是“迷宫结束”字符还是宝藏

然后确定当前位置(x,y)是否为“迷宫开始”字符

此时,如果满足所有其他条件,我将让我的算法在该位置绘制一个角色。此字符表示该位置已被访问。稍后,您可以选择遍历已收集的坐标,并在选择时将此字符替换为空白

困难的部分已经完成了。现在递归调用该方法,这一次传递新坐标,对迭代器/解算器的每个方向调用一次。例如if(checkPath(r,c-1)==true)//向西走

此时,您可以将迷宫的访问路径更改为空间。例如迷宫[r][c]=''


这是我在不给你完整答案的情况下能做的最好的了

如果你能使用一种方法,那将很有帮助。这将压缩代码,更少的代码总是包含更少的bug。这就是你做的“调试”的地方。或者你放弃,转而使用艺术。@HotLicks-来吧,每个人都必须从某个地方开始。恕我直言,插入
println
语句,然后跟着代码的走向走。找出它在哪里做你不想做的事情。这是编程的“繁重工作”。@RustyTheBoyRobot-如果你不学会如何调试,你最好放弃。没有调试就没有编程。我不使用IDE,但我会尝试使用调试器,我也会尝试只使用一种方法,我会发布更新的代码。谢谢大家的帮助和批评。我推荐Eclipse。刚开始使用时很痛苦,但你无法战胜价格。还有很多人愿意在互联网上提供帮助。我最终使用了一种方法调用方法。它使编写代码变得更加容易,并且使我的代码大大更小、更紧凑。谢谢你的帮助。谢谢,这很有道理。没问题。试着把你现在拥有的东西放在一起,看看你能想出什么。如果您还有其他问题,我可以帮您解决。+1-递归算法应该始终使用基本情况和递归步骤来定义。在进行此调试时,从一个更小、更简单的迷宫开始;大约5x5。这将给你一个较小的问题来解决,并将使它更容易找到错误。只是MHO。