-2

我的代码的目的是创建一个程序,该程序将在迷宫中读取并将其存储到二维数组中并解决它。我让程序读取迷宫并将其放入数组中,但我的递归算法不起作用,这是我第三次更改它以使其工作。那么你能帮我让它工作吗?

编辑:我发现我的原始算法存在问题,因为我得到它来解决迷宫,但我遇到了另一个问题。该程序没有打印出正确的东西。这也只是出于我的好奇心。我已经找到了如何让它以另一种方式工作。

迷宫代码:

 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
4

2 回答 2

3

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

MePePeR 的建议:使用一种方法调用

将您的单个goXXXX()呼叫转换为单个go(dx, dy)呼叫。如果您正在尝试处理递归(正如您的问题所暗示的那样),您可能应该非常熟悉首先编写自己的方法。请注意,每个goXXXX()方法几乎都是相同的,除了在每个方法中您都修改了currColcurrRow变量。如果您将更改量作为参数传递(即 as 的更改和ascurrColdx更改),您可以一遍又一遍地使用相同的方法,只是给它不同的值。向东移动,向南移动,等等。currRowdygo(1, 0)go(0, -1)

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

Hot Lick 的建议:使用调试器。

你已经用你的printMaze方法迈出了第一步。如果您不是在 IDE 中开发(我刚开始学习时没有),调试器可能有点难以使用。在这种情况下,您只需使用更多System.out.println语句来获取有关代码执行的更多信息。如果您正在使用 IDE,请开始尝试调试器。一旦您开始使用它们,它们就真的很容易使用。再一次,如果您遇到困难,请与我们联系,我们可以帮助指导您。

最后一个指针:注意你的迷宫打印输出是这样的:

xVVx
PPVx
xPxx

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

于 2013-04-25T20:18:43.077 回答
3

确定您的基本条件(案例)是什么。在这种情况下,您的基本情况可能是确定当前位置 (x, y) 是否大于天花板、小于地板、小于左墙或大于右墙。

接下来,您可能应该确定当前位置 (x, y) 是“迷宫尽头”角色还是宝藏。

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

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

困难的部分已经完成。现在您递归地调用该方法,这次传入新坐标,为您希望迭代器/求解器移动的每个方向一次。前任。if (checkPath(r, c-1) == true) // 向西走

此时,您现在可以将迷宫的已访问路径更改为空格。前任。迷宫[r][c] = ' ';

这是我能做的最好的事情,而不会给你完整的答案。

于 2013-04-25T20:20:37.173 回答