Java 获取迷宫中的所有路径(仅限水平/垂直移动)

Java 获取迷宫中的所有路径(仅限水平/垂直移动),java,graph,depth-first-search,breadth-first-search,maze,Java,Graph,Depth First Search,Breadth First Search,Maze,我试图找到迷宫中所有的路径,其中唯一有效的移动是向右(“H”)或向下(“V”)。我想返回这些路径的字符串列表 我的代码目前没有返回这些字符串的列表,我认为错误在于试图使用相同的字符串对象递归地构建答案。如果有人能帮我解决这个问题(或者他们可能看到的任何其他错误),我将非常感激 我考虑过制作一个坐标类,这是正确的方法吗?如果是这样,我不知道如何使用这个类来生成正确的字符串。这就是我所认为的课堂的样子: public static class Coordinate { public

我试图找到迷宫中所有的路径,其中唯一有效的移动是向右(“H”)或向下(“V”)。我想返回这些路径的字符串列表

我的代码目前没有返回这些字符串的列表,我认为错误在于试图使用相同的字符串对象递归地构建答案。如果有人能帮我解决这个问题(或者他们可能看到的任何其他错误),我将非常感激

我考虑过制作一个坐标类,这是正确的方法吗?如果是这样,我不知道如何使用这个类来生成正确的字符串。这就是我所认为的课堂的样子:

 public static class Coordinate {
        public int row, col;
        public String path;
        
        public Coordinate (int row, int col) {
            this.row = row;
            this.col = col;
            path = new String();
        }
        
        public addLetter(String s) {
            path = path + s;
        }
    }
如果我的矩阵大小为3,则问题的示例如下:

 0  1 2 
0 X H H
1     V
2     V

 0  1 2 
0 X H 
1   V H
2     V

 0  1 2 
0 X H 
1   V
2   V H

 0  1 2 
0 X 
1 V H H
2     V

 0  1 2 
0 X 
1 V H 
2   V H

 0  1 2 
0 X 
1 V  
2 V H H

And all the possible strings are:
- HHVV, HVHV, HVVH, VHHV, VHVH, VVHH
因此,如果输入n等于3,函数应返回字符串列表[“HHVV”、“hvv”、“HVVH”、“HVVH”、“vhv”、“VHVH”]

如果输入n为2,则函数应返回: [“HV”、“VH”]

类结果{
公共静态列表GetSafePath(int n){
//在图形上做一个dfs
列表路径=新的ArrayList();
int-er=n-1;
int ec=n-1;
int[][]矩阵=新的int[n][n];
矩阵[0][0]=2;//所有访问的节点都更改为两个
获取路径(矩阵,0,0,er,ec,路径,“”);
返回路径;
}
公共静态void getpath(int[][]矩阵、int sr、int sc、int er、int ec、列表路径、字符串s){
如果(sr==er&&sc==ec){
添加(新字符串);
}
最终整数[][]移位={
{0,1},//向右走
{1,0}//向下
};
for(int[]班次:班次){
int right=-1;
向下整数=-1;
//我们是往下走还是向右走?需要这个来添加正确的字母吗
如果(移位[0]==0){
右=1;
}
否则{
向下=1;
}
字符串字母=有效(矩阵,sr+shift[0],sc+shift[1],右,下);
如果(字母!=null){
如果(字母==“H”){
s=s+“H”;
}
如果(字母==“V”){
s=s+“V”;
}
矩阵[sr+shift[0]][sc+shift[1]]=2;
获取路径(矩阵,sr+shift[0],sc+shift[1],er,ec,路径,s);
} 
}
}
公共静态字符串有效(int[][]矩阵、int sr、int sc、int right、int down){
如果(sr>=0&&sr=0&&sc
主要问题(但肯定不是唯一的问题)是访问位置的标记(通过将
矩阵的值设置为2来标记)。
位置标记为2后,以下搜索不能在路径中包含此位置。
以目标位置为例。到达后,它被标记为2,这意味着后续搜索无法再访问它。这就是为什么搜索完成后,
路径
只包含一条路径。 事实上,在这种情况下,根本不需要标记访问位置。唯一可能的移动是向下和向右,因此搜索不能返回同一位置两次
只需注释掉
矩阵[currentRow+shift[0]][currentColumn+shift[1]]=2以获取更多路径(并显示更多错误)


旁注:
请澄清您的问题:输入看起来如何?添加硬编码测试数据,以便我们可以复制粘贴并运行。预期产量是多少?添加测试数据的预期输出。嗨,函数将接受一个数字,该数字将是矩阵的大小。我已经为n==3和n==2提供了两个测试响应,所以您总是从左上角到右下角搜索路径。您可能希望将此信息添加到问题中。另请参见(您有一些已回答的问题,但没有回答)
class Result {
  
    public static List<String> getSafePaths(int n) {
    //do a dfs on the graph
        List<String> paths = new ArrayList<>();
 
        int er = n - 1;
        int ec = n - 1;
        int[][] matrix = new int[n][n]; 
        matrix[0][0] = 2; //all visited nodes changed to two
   
        getPaths(matrix, 0, 0, er, ec, paths, "");
    
        
        return paths;
    }
    
    public static void getPaths(int[][] matrix, int sr, int sc, int er, int ec, List<String> paths, String s) {
        if(sr == er && sc == ec) {
            paths.add(new String(s));
        }
        
        final int[][] SHIFTS = {
            {0, 1}, //go right
            {1,0} // go down
        };
        
        for(int[] shift : SHIFTS) {
            int right = -1;
            int down = -1;
            //are we going down or right? Need this to add correct letter
            if(shift[0] == 0) {
                right = 1;
            }
            else {
                down = 1;
            }
            
            String letter = valid(matrix, sr + shift[0], sc + shift[1], right, down);
            if(letter != null) {
                
                if(letter == "H") {

                    s = s + "H";
                   
                }
                if(letter == "V") {

                    s = s + "V";

                }
              
                matrix[sr + shift[0]][sc + shift[1]] = 2;
                
                getPaths(matrix, sr + shift[0], sc + shift[1], er, ec, paths, s);
            } 
        }
    }
    
    public static String valid(int[][] matrix, int sr, int sc, int right, int down) {
        if(sr >= 0 && sr < matrix.length && sc >= 0 && sc < matrix[sr].length && matrix[sr][sc] != 2) {
            if(right == 1) {
                return "H";
            }
            else {
                return "V";
            }
        }
        return null;
    }

}

            /* check for equality  between strings by letter.equals("H")
            if(letter == "H") {
                s = s + "H";
            }
            if(letter == "V") {
                s = s + "V";
            }
            */

            //the two if blocks are not needed. letter can only be V or H so simply do:
            s=s+letter;  //or s+=letter  or s=s.concat(letter)