Java 回溯法获取迷宫解中的点

Java 回溯法获取迷宫解中的点,java,recursion,backtracking,Java,Recursion,Backtracking,因此,我一直在努力创建一个功能齐全的mazegame。我实现了一个使用DFS的迷宫生成算法,我还实现了一个使用DFS的最短路径算法。现在我要做的是背诵你需要移动的顶点,以使用从起点到B点的最短路径。一想到它,我就想到了回溯,我从来没有真正实现过回溯,所以现在我有点迷路了。这是我的代码,minB是一个数组,它保存了从点A到迷宫上任何其他点的最短路径。我的逻辑是,如果两个节点之间的最短路径差为1,如果新单元不是墙,并且没有超出边界,则尝试在当前节点周围的所有4个方向上推送节点。如果你已经到达B点,恭

因此,我一直在努力创建一个功能齐全的mazegame。我实现了一个使用DFS的迷宫生成算法,我还实现了一个使用DFS的最短路径算法。现在我要做的是背诵你需要移动的顶点,以使用从起点到B点的最短路径。一想到它,我就想到了回溯,我从来没有真正实现过回溯,所以现在我有点迷路了。这是我的代码,minB是一个数组,它保存了从点A到迷宫上任何其他点的最短路径。我的逻辑是,如果两个节点之间的最短路径差为1,如果新单元不是墙,并且没有超出边界,则尝试在当前节点周围的所有4个方向上推送节点。如果你已经到达B点,恭喜你打印出这些点。如果到达的点与a到B的最短路径相同,但不是B,则返回。好吧,这就是问题所在,我不知道如何从列表“点”中取出节点,因为是什么阻止您返回此配置?如果我的解释不好,就说出来,我会尽力澄清

static ArrayList<int[]> points = new ArrayList<int[]>();

public static void backtrack(int x, int y) {
    if (maze[x][y] == 'B') {
        for(int i=0;i<points.size();++i){
            System.out.println(points.get(i)[0]+" "+points.get(i)[1]);
        }
        return;
    } else if(minB[x][y]==minB[col-1][row-2]&&maze[x][y]!='B') {
        /*DONT KNOW WHAT TO DO HERE*/
        points.remove(points.size()-1);
        return;
    }else{
        int[]point={x,y};
        points.add(point);
        for (int[] dirs : dir) {
            int x1 = x + dirs[0];
            int y1 = y + dirs[1];
            if (x1 >= 0 && y1 >= 0 && y1 < row && x1 < col) {
                if (maze[x1][y1] != '#') {
                    if(minB[x1][y1]-minB[x][y]==1){
                        backtrack(x1,y1);
                    }
                }
            }
        }
    }
}
static ArrayList points=new ArrayList();
公共静态无效回溯(整数x,整数y){
如果(迷宫[x][y]=='B'){
对于(int i=0;i=0&&y1>=0&&y1
minB和
mindB
应该是什么?值得一提的是,这是一个众所周知的解决方案,可以找到两点之间的最短路径,因此您可以实现它。我已经在我的另一个程序上实现了dijkstra……是的,它确实可以找到两点之间的最短路径。但它本身并不能找到顶点本身,这是一个未加权的图,所以我不需要它。minB是最短路径是指从A到迷宫中任何其他点的最短路径的数组。你是什么意思,“它本身不能找到顶点本身?”此外,Dijkstra的算法适用于未加权图,因为在这一点上,找到涉及的顶点数最少的路径就成了问题。