Java 递归迷宫遍历算法的问题
我的代码的目的是创建一个程序,该程序将在迷宫中读取数据,并将其存储到二维数组中,然后进行求解。我让程序读取迷宫并将其放入数组,但我的递归算法不起作用,这是我第三次尝试改变它以使其起作用。你能帮我把这件事做好吗 编辑:我发现了我原来的算法的问题,从某种意义上说,我得到了它来解决迷宫,但我遇到了另一个问题。程序没有打印出正确的内容。这也是出于我的好奇心。我已经找到了让它以另一种方式工作的方法 迷宫代码:Java 递归迷宫遍历算法的问题,java,algorithm,maze,Java,Algorithm,Maze,我的代码的目的是创建一个程序,该程序将在迷宫中读取数据,并将其存储到二维数组中,然后进行求解。我让程序读取迷宫并将其放入数组,但我的递归算法不起作用,这是我第三次尝试改变它以使其起作用。你能帮我把这件事做好吗 编辑:我发现了我原来的算法的问题,从某种意义上说,我得到了它来解决迷宫,但我遇到了另一个问题。程序没有打印出正确的内容。这也是出于我的好奇心。我已经找到了让它以另一种方式工作的方法 迷宫代码: public static boolean goNorth(){ boolea
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
评论中有很多好的建议;我会尽我所能总结它们 MePePeR的建议:使用一个方法调用 将您的单个
goXXXX()
调用转换为单个go(dx,dy)
调用。如果您正试图处理递归(正如您的问题所示),那么您应该首先非常熟悉编写自己的方法。请注意,每个goXXXX()
方法几乎相同,除了在每个方法中修改currCol
和currRow
变量。如果将更改量作为参数传递(即,currCol
asdx
的更改和currRow
asdy
),则可以反复使用相同的方法,只是给它不同的值。向东移动将是go(1,0)
,向南移动将是go(0,-1)
,等等
如果您对传递参数不太满意,请尝试一下,发布更新的代码,我们可以指导您解决遇到的问题
热舔的建议:使用调试器。
您已经使用printMaze
方法迈出了第一步。如果您不是在IDE中开发(我刚开始学习时没有),那么调试器可能有点难以使用。在这种情况下,您需要简单地使用更多的System.out.println
语句来获取有关代码执行的更多信息。如果您正在使用和IDE,请开始尝试调试器。一旦你开始玩它们,它们真的很容易使用。再一次,如果你陷入困境,请与我们交谈,我们可以帮助指导你
最后一个指针:注意迷宫打印输出有以下内容:
xVVx
PPVx
xPxx
既然你只能去北、南、东或西的自由空间,你怎么能在右上角得到一个
V
?这表明您的代码可能标记了错误的单元格,或者允许非法移动。确定您的基本条件(case)。在本例中,基本情况可能是确定当前位置(x,y)是否大于天花板、小于地板、小于左墙还是大于右墙
接下来,您可能应该确定当前位置(x,y)是“迷宫结束”字符还是宝藏
然后确定当前位置(x,y)是否为“迷宫开始”字符
此时,如果满足所有其他条件,我将让我的算法在该位置绘制一个角色。此字符表示该位置已被访问。稍后,您可以选择遍历已收集的坐标,并在选择时将此字符替换为空白
困难的部分已经完成了。现在递归调用该方法,这一次传递新坐标,对迭代器/解算器的每个方向调用一次。例如if(checkPath(r,c-1)==true)//向西走
此时,您可以将迷宫的访问路径更改为空间。例如迷宫[r][c]=''
这是我在不给你完整答案的情况下能做的最好的了 如果你能使用一种方法,那将很有帮助。这将压缩代码,更少的代码总是包含更少的bug。这就是你做的“调试”的地方。或者你放弃,转而使用艺术。@HotLicks-来吧,每个人都必须从某个地方开始。恕我直言,插入
println
语句,然后跟着代码的走向走。找出它在哪里做你不想做的事情。这是编程的“繁重工作”。@RustyTheBoyRobot-如果你不学会如何调试,你最好放弃。没有调试就没有编程。我不使用IDE,但我会尝试使用调试器,我也会尝试只使用一种方法,我会发布更新的代码。谢谢大家的帮助和批评。我推荐Eclipse。刚开始使用时很痛苦,但你无法战胜价格。还有很多人愿意在互联网上提供帮助。我最终使用了一种方法调用方法。它使编写代码变得更加容易,并且使我的代码大大更小、更紧凑。谢谢你的帮助。谢谢,这很有道理。没问题。试着把你现在拥有的东西放在一起,看看你能想出什么。如果您还有其他问题,我可以帮您解决。+1-递归算法应该始终使用基本情况和递归步骤来定义。在进行此调试时,从一个更小、更简单的迷宫开始;大约5x5。这将给你一个较小的问题来解决,并将使它更容易找到错误。只是MHO。