java:Maze Solver使用Backtracking卡在循环中

时间:2014-11-29 18:24:28

标签: java backtracking maze

我希望通过一点点谷歌搜索后回溯来解决迷宫问题!我看到这个算法: Recursion: Solving a Maze

这里是:

FIND-PATH(x,y)

  1. if(x,y outside maze)返回false

  2. if(x,y is goal)return true

  3. 如果(x,y未打开)返回false

  4. 将x,y标记为解决方案路径的一部分

  5. if(FIND-PATH(x,y之前)== true)返回true

  6. if(FIND-PATH(东方x,y)== true)返回true

  7. if(FIND-PATH(x,y以南)== true)返回true

  8. if(FIND-PATH(西x,y)== true)返回true

  9. 取消标记x,y作为解决方案路径的一部分

  10. 返回false

  11. 我尝试正确实现它,如下所示:

    public class main {
    
    public static void main(String[] args) {
        // A as a Start and B is finish Line
        char maze[][] = { 
                { '#', '#', '#', '#', '#', '#', '#', '#', '#', '#' },
                { '#', 'A', ' ', ' ', '#', ' ', '#', ' ', ' ', '#' },
                { '#', ' ', ' ', ' ', '#', ' ', '#', ' ', '#', '#' },
                { '#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#' },
                { '#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#' },
                { '#', '#', '#', ' ', ' ', ' ', ' ', ' ', ' ', '#' },
                { '#', ' ', ' ', ' ', ' ', '#', '#', '#', '#', '#' },
                { '#', ' ', ' ', ' ', ' ', ' ', '#', ' ', '#', '#' },
                { '#', 'B', '#', ' ', ' ', ' ', ' ', ' ', ' ', '#' },
                { '#', '#', '#', '#', '#', '#', '#', '#', '#', '#' }
    
        };
    
        for (int i = 0; i < maze.length; i++) {
            System.out.println(maze[i]);
        }
    
        mazeTraversal(maze, 1, 1);
    }
    
    static boolean mazeTraversal(char m[][], int i, int j) {
        if (m[i][j] == '#')
            return false;
        if (m[i][j] == 'B')
            return true;
        // marking as a part of path
        m[i][j] = '*';
        //north
        if ((mazeTraversal(m, i , j - 1)) == true) {
            return true;
        }
        //east
        if ((mazeTraversal(m, i + 1 , j)) == true) {
            return true;
        }
        //south
        if ((mazeTraversal(m, i , j + 1)) == true) {
            return true;
        }
        //west
        if ((mazeTraversal(m, i - 1, j)) == true) {
            return true;
        }
            m[i][j] = ' ';
            return false;
    }
    }
    

    这是控制台错误:(堆栈溢出)!

    Exception in thread "main" java.lang.StackOverflowError
        at main.mazeTraversal(main.java:35)
        at main.mazeTraversal(main.java:35)
        at main.mazeTraversal(main.java:43)
        at main.mazeTraversal(main.java:35)
        at main.mazeTraversal(main.java:43)
        at main.mazeTraversal(main.java:35)
        at main.mazeTraversal(main.java:43)
        at main.mazeTraversal(main.java:35)
        at main.mazeTraversal(main.java:43)
        at main.mazeTraversal(main.java:35)
        at main.mazeTraversal(main.java:43)
        at main.mazeTraversal(main.java:35)
        at main.mazeTraversal(main.java:43)
        at main.mazeTraversal(main.java:35)
        at main.mazeTraversal(main.java:43)
        at main.mazeTraversal(main.java:35)
    

    我也做了几次追踪,我发现它陷入了循环,它永远不会走得更远...... 是我的代码错了还是算法错了?

2 个答案:

答案 0 :(得分:4)

空方框是一个不包含#*的正方形,您只需检查#
*检查不需要以无限递归结束(即以与刚刚相同的方式返回)

将代码更改为;

static boolean mazeTraversal(char m[][], int i, int j) {
    if (m[i][j] == '#')
        return false;
    if (m[i][j] == 'B')
        return true;
    if (m[i][j] == '*')    // <-- added check
        return false;
    // marking as a part of path
...

...并在运行求解器后打印结果;

##########
#A  # #  #
#   # # ##
#        #
#        #
###      #
#    #####
#     # ##
#B#      #
##########

##########
#*  # #  #
#*  # # ##
#*       #
#***     #
###*     #
#*** #####
#*    # ##
#B#      #
##########

......看起来像你正在尝试做的事情。

答案 1 :(得分:2)

你进入了一个无限循环。您应该检查您是否已回到已经成为路径一部分的单元格中:

if(m[i][j]=='*')
    return false;