我的代码的目的是创建一个程序,它将在迷宫中读取并将其存储到2D数组中并解决它。我得到程序来读取迷宫并将其放入数组但我的递归算法不起作用,这是我改变它试图让它工作的第三个不同的时间。那么你可以帮助我实现这个目标吗?
编辑:我发现了原始算法的问题,因为我得到它来解决迷宫,但我遇到了另一个问题。该程序没有打印出正确的东西。这也只是为了我的好奇心。我已经找到了如何让它以另一种方式工作。
迷宫代码:
public static boolean goNorth(){
boolean success;
if (maze[currCol][currRow - 1] == maze[finishCol][finishRow]) {
success = true;
}
if(maze[currCol][currRow - 1] == CLEAR){
maze[currCol][currRow - 1] = PATH;
currRow = currRow - 1;
success = goNorth();
if(!success){
success = goWest();
if(!success){
success = goEast();
if(!success){
maze[currCol][currRow] = VISITED;
currRow = currRow + 1;
}
}
}
return success;
} else {
return false;
}
}
public static boolean goWest(){
boolean success;
if (maze[currCol - 1][currRow] == maze[finishCol][finishRow]) {
success = true;
}
if(maze[currCol - 1][currRow] == CLEAR){
maze[currCol - 1][currRow] = PATH;
currCol = currCol - 1;
success = goWest();
if(!success){
success = goSouth();
if(!success){
success = goNorth();
if(!success){
maze[currCol][currRow] = VISITED;
currCol = currCol + 1;
}
}
}
return success;
} else {
return false;
}
}
public static boolean goEast(){
boolean success;
if (maze[currCol + 1][currRow] == maze[finishCol][finishRow]) {
success = true;
}
if(maze[currCol + 1][currRow] == CLEAR){
maze[currCol + 1][currRow] = PATH;
currCol = currCol + 1;
success = goEast();
if(!success){
success = goNorth();
if(!success){
success = goSouth();
if(!success){
maze[currCol][currRow] = VISITED;
currCol = currCol - 1;
}
}
}
return success;
} else {
return false;
}
}
public static boolean goSouth(){
boolean success;
if (maze[currCol][currRow + 1] == maze[finishCol][finishRow]){
success = true;
}
if(maze[currCol][currRow + 1] == CLEAR){
maze[currCol][currRow + 1] = PATH;
currRow = currRow + 1;
success = goSouth();
if(!success){
success = goEast();
if(!success){
success = goWest();
if(!success){
maze[currCol][currRow] = VISITED;
currRow = currRow - 1;
}
}
}
return success;
} else {
return false;
}
}
}
迷宫解算器代码:
public class SolveMaze1
{
public static void main (String[] args)
{
Maze1 maze = new Maze1();
maze.readMaze();
maze.printMaze();
maze.goNorth();
maze.printMaze();
}
}
期望的结果:
xxxxxxxxxxxxxxxxxxFx
x x xxxx x
x xxxxx xxxxx xx x
x xxxxx xxxxxxx xx x
x xx xx x
x xxxxxxxxxx xx x
xxxxxxxxxxxxSxxxxxxx
xxxxxxxxxxxxxxxxxxFx
xVVVVVxPPPPPPPxxxxPx
xVxxxxxPxxxxxPPPxxPx
xVxxxxxPxxxxxxxPxxPx
xVVVVVVPPPPPPxxPxxPx
xVxxxxxxxxxxPxxPPPPx
xxxxxxxxxxxxSxxxxxxx
我的结果:
xxxxxxxxxxxxxxxxxxFx
xVVVVVxVVVVVVVxxxxVx
xVxxxxxVxxxxxVVVxxVx
xVxxxxxVxxxxxxxVxxVx
xVVVVVVVVVVVVxxVxxVx
xVxxxxxxxxxxVxxVVVVx
xxxxxxxxxxxxSxxxxxxx
答案 0 :(得分:3)
评论中有很多好建议;我会尽力尽力总结一下。
将您的个人goXXXX()
电话转换为单个go(dx, dy)
电话。如果您正在尝试处理递归(正如您的问题所示),您可能应该首先熟悉编写自己的方法。请注意,每个goXXXX()
方法几乎完全相同,除非在每个方法中修改currCol
和currRow
变量。如果您将更改量作为参数传递(即currCol
的更改为dx
,而currRow
的更改为dy
),则可以使用相同的方法一遍又一遍,给它不同的价值观。向东移动go(1, 0)
,向南移动go(0, -1)
等等。
如果您对传递参数不太满意,请尝试一下,发布更新的代码,我们可以指导您解决遇到的问题。
您已经使用printMaze
方法迈出了第一步。如果您不是在IDE中开发(我刚开始学习时没有),调试器可能有点难以使用。在这种情况下,您需要简单地使用更多System.out.println
语句来获取有关代码执行的更多信息。如果 使用和IDE,请开始尝试调试器。一旦你开始玩它们,它们真的很容易使用。再一次,如果你遇到困难,请与我们联系,我们可以帮助指导你。
最后一个指针:注意你的迷宫打印输出有这个:
xVVx
PPVx
xPxx
由于你只能向北,南,东或西进入一个自由空间,你怎么能在右上角得到V
?这表明您的代码可能标记错误的单元格,或者允许移动是非法的。
答案 1 :(得分:3)
确定您的基本条件(案例)。在这种情况下,您的基本情况可能是确定当前位置(x,y)是否大于天花板,小于地板,小于左墙或大于右墙。
接下来,您应该确定当前位置(x,y)是否是'迷宫结束'字符或宝藏。
然后确定当前位置(x,y)是否是'迷宫开始'字符。
此时,如果满足所有其他条件,我会让算法在该位置绘制一个字符。此字符表示已访问该职位。稍后,您可以选择遍历已收集的坐标,如果选择,则用空格替换此字符。
困难的部分已经完成。现在你递归地调用这个方法,这次传入新的坐标,每个方向都需要你的迭代器/求解器。防爆。 if(checkPath(r,c-1)== true)// go west
此时,您现在可以将迷宫的访问路径更改为空格。防爆。迷宫[r] [c] ='';
在没有给出完整答案的情况下,这是我能做的最好的事情。