java:使用回溯卡在循环中的迷宫解算器

java:使用回溯卡在循环中的迷宫解算器,java,backtracking,maze,Java,Backtracking,Maze,我想通过回溯来解决迷宫,在谷歌搜索之后!我看到这个算法: 这是: 查找路径(x,y) 如果(x,y在迷宫外)返回false 如果(x,y是目标)返回true 如果(x,y未打开)返回false 将x、y标记为解决方案路径的一部分 if(FIND-PATH(x,y以北)=true)返回true if(FIND-PATH(x,y以东)=true)返回true if(FIND-PATH(x,y以南)=true)返回true if(FIND-PATH(x,y以西)=true)返回true 取消将x、y

我想通过回溯来解决迷宫,在谷歌搜索之后!我看到这个算法:

这是:

查找路径(x,y)

  • 如果(x,y在迷宫外)返回false

  • 如果(x,y是目标)返回true

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

  • 将x、y标记为解决方案路径的一部分

  • if(FIND-PATH(x,y以北)=true)返回true

  • if(FIND-PATH(x,y以东)=true)返回true

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

  • if(FIND-PATH(x,y以西)=true)返回true

  • 取消将x、y标记为解决方案路径的一部分

  • 返回错误

  • 我尝试正确地实施它,如下所示:

    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;
    }
    }
    
    我也做过几次跟踪,我看到它卡在一个循环中,再也无法继续下去。。。
    是我的代码错了还是算法错了?

    开方是不包含
    *
    的正方形,您只检查

    *
    检查要求不以无限递归结束(即返回与刚才相同的方式)

    将代码更改为

    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
    ...
    

    …这看起来像是您要做的。

    开放正方形是不包含
    *
    的正方形,您只检查

    *
    检查要求不以无限递归结束(即返回与刚才相同的方式)

    将代码更改为

    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
    ...
    

    …这看起来像是你要做的。

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

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

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

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

    你在哪里做步骤3?实际上1,3是合并的。循环也发生在迷宫内部。我认为[3]只处理[1]这个特定的迷宫,因为你在迷宫的四面都有栅栏。你在哪里做步骤3?实际上1,3是合并的。循环也发生在迷宫内部。我认为[3]处理[1]只适用于这个特殊的迷宫,因为迷宫的四面都有栅栏。