java - 如何从迷宫求解算法中的错误路径返回? ( java )

标签 java recursion backtracking

我一直在尝试用 java 创建迷宫求解算法。我尝试通过回溯递归来做到这一点。这是我的代码:

public static boolean solver(String[][] maze, int i, int j){
    display(maze);//prints maze
    System.out.println();
    maze[i][j] = "*";
    if(maze[i][j+1] == "E" || maze[i][j-1] == "E" || maze[i+1][j] == "E" || maze[i-1][j] == "E")
        display(maze);
    else if(maze[i][j+1] != " " && maze[i][j-1] != " " && maze[i+1][j] != " " && maze[i-1][j] != " "){
        maze[i][j] = " ";
        return false;
    }
    if(maze[i][j+1] == " ")
        if(!solver(maze,i,j+1))
            maze[i][j] = " ";
    if(maze[i][j-1] == " ")
        if(!solver(maze,i,j-1))
            maze[i][j] = " ";
    if(maze[i+1][j] == " ")
        if(!solver(maze,i+1,j))
            maze[i][j] = " ";
    if(maze[i-1][j] == " ")
        if(!solver(maze,i-1,j))
            maze[i][j] = " ";
    return true;
}

这是主要方法:

String[][] maze = {{"#","S","#","#","#","#","#","#","#","#","#","#","#"},
                   {"#"," "," "," "," "," ","#"," "," "," "," "," ","#"},
                   {"#"," ","#","#","#","#","#"," ","#","#","#"," ","#"},
                   {"#"," "," "," "," "," ","#"," ","#"," ","#"," ","#"},
                   {"#"," ","#","#","#"," ","#"," ","#"," ","#"," ","#"},
                   {"#"," "," "," ","#"," ","#"," "," "," ","#"," ","#"},
                   {"#"," "," "," ","#"," ","#"," "," "," ","#"," ","#"},
                   {"#"," ","#"," ","#"," "," "," "," "," "," "," ","#"},
                   {"#","#","#"," ","#","#","#","#","#","#","#","#","#"},
                   {"#"," "," "," ","#"," "," "," "," "," "," "," ","#"},
                   {"#"," ","#","#","#"," ","#","#","#","#","#"," ","#"},
                   {"#"," "," "," "," "," ","#"," "," "," "," "," ","#"},
                   {"#","#","#","#","#","#","#","#","#","#","#","E","#"}};
solver(maze,1,1);

这个算法可以解决迷宫,但是这段代码中有一个错误,我无法解决这个错误。

输出:

#S###########
#*****#     #
# ##### ### #
#     # # # #
# ### # # # #
#   # #   # #
#   # #   # #
# # #       #
### #########
#   #       #
# ### ##### #
#     #     #
###########E#

#S###########
#***  #     #
#*##### ### #
#     # # # #
# ### # # # #
#   # #   # #
#   # #   # #
# # #       #
### #########
#   #       #
# ### ##### #
#     #     #
###########E#

正如您所看到的,它是这样来的,但是在返回时它没有正确删除星星。

如何解决这个错误?

最佳答案

也许它有助于从“迷宫”的具体表示中抽象出来,并将(完美)迷宫视为二维网格上无向图的生成树。然后您只需在该网格上实现您喜欢的任何寻路算法即可。 “解决”迷宫只是在网格边界上的两个顶点之间找到一条路径。

我已经基于图论 View 实现了许多迷宫生成和寻路算法,您可以在这里找到我的代码和演示应用程序:

https://github.com/armin-reichert/mazes

关于java - 如何从迷宫求解算法中的错误路径返回? ( java ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59694930/

相关文章:

java - 如何使用多线程维护异步操作的任务顺序

c# - 数据注释 : Recursively validating an entire object graph

c++ - 素数序列的回溯算法

algorithm - 带回溯的平衡二叉搜索树

java - 根据用户输入计算最小值,同时排除循环终止号 (-1)

java apache poi 如何设置两行始终显示

java - 如何在 Java 中将异常消息返回给调用 api?

Common Lisp 中的递归、推值和斐波那契数列

php - 是否可以在 PHP 中加速递归文件扫描?

c - 数独多解C