0

我有一个程序,它从一个文件中读取一个迷宫并将其放入一个 2D 数组中,并通过它使用递归进行导航,并将P放置在它曾经存在的任何地方,并将一个V放置在它曾经两次的地方。在我的算法中的某个地方发生了一个问题,导致迷宫只有 Vs。我已经写了很多println语句来试图调试这个问题。我是 Java 新手,我可能遗漏了一些明显的东西,但我一辈子都找不到问题所在。

迷宫代码:

public static boolean goNorth(){
        boolean success;
        if(maze[currCol][currRow - 1] == CLEAR){
            currRow = currRow - 1;
            maze[currCol][currRow] = PATH;
            if (maze[currCol][currRow] == maze[finishCol][finishRow]){ 
            success = true;
            } else {
                success = goNorth();
                if(!success){
                success = goWest();
                    if(!success){
                    success = goEast();
                        if(!success){
                        maze[currCol][currRow] = VISITED;
                        currRow = currRow + 1;
                        }
                    }
                }
            }
        } else {
            success = false;
    }
    return success;
}

public static boolean goWest(){
        boolean success;
        if(maze[currCol - 1][currRow] == CLEAR){
            currCol = currCol - 1;
            maze[currCol][currRow] = PATH;
            if (maze[currCol][currRow] == FINISH){
            success = true;
            } else {
            success = goWest();
                if(!success){
                success = goSouth();
                    if(!success){
                    success = goNorth();
                        if(!success){
                            maze[currCol][currRow] = VISITED;
                        currCol = currCol + 1;
                        }
                        }
                    }
                }
            } else {
                success = false;
        }
        return success;
    }

public static boolean goEast(){
        boolean success;
        if(maze[currCol + 1][currRow] == CLEAR){
            currCol = currCol + 1;
            maze[currCol][currRow] = PATH;
            if (maze[currCol][currRow] == FINISH){
            success = true;
            } else {
            success = goEast();
                if(!success){
                success = goNorth();
                    if(!success){
                    success = goSouth();
                        if(!success){
                            maze[currCol][currRow] = VISITED;
                            currCol = currCol - 1;
                            }
                        }
                    }
                }
            } else {
                success = false;
        }
        return success;
    }

public static boolean goSouth(){
        boolean success;
        if(maze[currCol][currRow + 1] == CLEAR){
            currRow = currRow + 1;
            maze[currCol][currRow] = PATH;
            if (maze[currCol][currRow + 1] == FINISH){
            success = true;
            } else {
            success = goSouth();
                if(!success){
                success = goEast();
                    if(!success){
                    success = goWest();
                        if(!success){
                            maze[currCol][currRow] = VISITED;
                            currRow = currRow - 1;
                            }
                        }
                    }
                }
            } else {
                success = false;
        }
        return success;
    }

期望的输出:

xxxxxxxxxxxxxxxxxxFx
xVVVVVxPPPPPPPxxxxPx
xVxxxxxPxxxxxPPPxxPx
xVxxxxxPxxxxxxxPxxPx
xVVVVVVPPPPPPxxPxxPx
xVxxxxxxxxxxPxxPPPPx
xxxxxxxxxxxxSxxxxxxx

我得到的输出:

xxxxxxxxxxxxxxxxxxVx
xVVVVVxVVVVVVVxxxxVx
xVxxxxxVxxxxxVVVxxVx
xVxxxxxVxxxxxxxVxxVx
xVVVVVVVVVVVVxxVxxVx
xVxxxxxxxxxxVxxVVVVx
xxxxxxxxxxxxSxxxxxxx
4

2 回答 2

3

您的调试策略不是很好,如果您更改调试策略,您将能够解决您的问题。例如,您最关心的应该是第一次选择错误路径时应用程序的状态(第一次出现 V 出现在应该是 P 的位置)。您需要确定该点并暂停应用程序,查看重要变量的状态。这会告诉你出了什么问题。

我对您的建议是使用 Eclipse IDE。在代码的第一个重要部分旁边设置断点,只需双击该代码行的左侧(或右键单击并选择断点选项)即可完成。然后,一旦设置了断点,就在 Eclipse 中启动调试器。您可以很容易地启动调试器,它是工具栏中运行选项旁边的选项。Eclipse 在遇到断点时会自动暂停,您可以单步执行代码。Eclipse 将向您显示每个变量的值,您可以使用该信息来找出问题所在。

如果您想要解决您的问题而不是关于如何解决它的建议,我深表歉意,但您显然是初学者,我不会为您做功课对您有任何帮助。无论如何,祝你好运。

在 Eclipse 中调试的文章

于 2013-04-26T03:48:25.820 回答
1

我已仔细阅读您的解决方案。您的代码的主要问题是您的递归很混乱。

举个例子:如果现在是(5,5)(除了墙壁之外的所有网格都是清除的),并且在你的 goNorth 方法中。然后您将进入 (4,5) 并在一个新的 goNorth 方法中,此方法稍后有时会调用 goSouth,但您将再次进入 (5,5)!现在 (5,5) 周围的网格不清晰。你不能去任何地方(goNorth 和 goSouth 等将返回 false)。

所以,你看到了问题。试着想出一个新的正确递归来解决这个问题。

于 2013-04-26T08:36:56.540 回答