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