所以我正在研究这个程序,它将递归地解决我从txt文件中获得的迷宫。我将迷宫放入2d阵列。这是最简单迷宫的一个例子。
+-+-+-+
|S| |
+ + + +
| |E|
+-+-+-+
我知道我可能不会以最好的方式解决迷宫,但我认为我的方式有效,我只需要知道如何打破我的递归循环。我正在做的是检查下一个地方是否有一个寄宿生,如果有两个地方,如果没有'*'那么我移动那里并放下一个标记。这让我走到了迷宫的尽头,但之后就破了。我需要一种摆脱循环的方法。我刚刚开始学习递归,所以我认为这是问题,但我不确定。
错误的选择方法会让我回到最后一个地方,那里有一个有开放边界的单元格,而且在两个地方没有'*'。
public static void solveMaze(int COL, int ROW){
//find first open cell and choose it
if(drawArray[COL][ROW+1] == ' ' && drawArray[COL][ROW+2] != '*'){
//if(drawArray[COL][ROW+2] == 'E')
drawArray[COL][ROW+2] = '*';
ROW+= 2;
solveMaze(COL,ROW);
}
else if(drawArray[COL+1][ROW] == ' ' && drawArray[COL+2][ROW] != '*'){
drawArray[COL+2][ROW] = '*';
COL+= 2;
solveMaze(COL,ROW);
}
else if(drawArray[COL][ROW-1] == ' ' && drawArray[COL][ROW-2] != '*'){
drawArray[COL][ROW-2] = '*';
ROW-= 2;
solveMaze(COL,ROW);
}
else if(drawArray[COL-1][ROW] == ' ' && drawArray[COL-2][ROW] != '*'){
drawArray[COL-2][ROW] = '*';
COL+= 2;
solveMaze(COL,ROW);
}
else
wrongChoice(COL,ROW);
}
答案 0 :(得分:0)
可以提供部分结果(最初为空)作为参数。一个人可以返回一个结果。 递归的另一个参数通常是可能的候选者的集合。
例如:
public static void solveMaze(int COL, int ROW, Path pathTaken) {
Path pathTaken = new Path();
if (solveMazeRecursively(START_COL, START_ROW, pathTaken)) {
...
}
}
private static boolean solveMazeRecursively(int COL, int ROW, Path pathTaken) {
if (drawArray[COL][ROW+1] == 'E') {
System.out.println(pathTaken);
return true;
}
// The real work...
if (drawArray[COL][ROW+1] == ' ' && drawArray[COL][ROW+2] != '*'){
drawArray[COL][ROW+2] = '*';
ROW += 2;
takenPath.add(COL, ROW+2);
if (solveMazeRecursively(COL,ROW, takenPath)) {
return true;
}
takenPath.remove(COL, ROW+2);
}
递归意味着首先进行延迟检查是否必须执行任何操作(解决方案存在或无法继续),否则委托给新的函数实例。