java - 使用堆栈的迷宫中的老鼠 (Java)

标签 java arrays data-structures 2d maze

给定一个二维字符数组,从给定点开始,我们必须找到一个“导出”,即给定矩阵周边的“0”。如果找到路径,程序将返回 true,当我稍后在 main 方法中运行它时,它将打印一条消息。我们只能向上、向左、向下或向右移动到附近的“0”。我已经尝试过完成这项工作,但是出现内存错误,这可能意味着我陷入了无限循环。我尝试使用我使用节点制作的堆栈来实现这个项目,我也使用泛型自己实现了这个项目,如下所示:

StringStackImpl<int[][]> s = new StringStackImpl<>(); 

在不同的 .java 文件中。这些工作正常。我尝试将字符的坐标存储在矩阵中,如下所示:

StringStackImpl<int[]> s = new StringStackImpl<>();
s.push(new int[]{i, j});

这是我的代码:

    private static boolean hasExit(char[][] maze, int n, int m, int i, int j) {
    int d = -1;
    boolean[][] visited = new boolean[n][m];
    for (int a = 0; a < visited.length; a++) {
        for (int b = 0; b < (visited[a]).length; b++) {
            visited[a][b] = false;
        }
    }
    StringStackImpl<int[]> s = new StringStackImpl<>();
    s.push(new int[]{i, j});
    while (!(s.isEmpty())) {
        int[] temp = s.peek();
        d += 1;
        i = temp[0];
        j = temp[1];
        if (((i == 0) || (i == n-1) || (j == 0) || (j == m-1)) && (maze[i][j] == '0')) {
            return true;
        }
        if (d == 0) {
            if ((i-1 >= 0) && (maze[i-1][j] == '0') && !(visited[i-1][j])) {
                visited[i-1][j] = true;
                s.push(new int[]{i-1, j});
                d = -1;
            }
        }
        else if (d == 1) {
            if ((j-1 >= 0) && (maze[i][j-1] == '0') && !(visited[i][j-1])) {
                visited[i][j-1] = true;
                s.push(new int[]{i, j-1});
                d = -1;
            }
        }
        else if (d == 2) {
            if ((i+1 < n) && (maze[i+1][j] == '0') && !(visited[i+1][j])) {
                visited[i+1][j] = true;
                s.push(new int[]{i+1, j});
                d = -1;
            }
        }
        else if (d == 3) {
            if ((j+1 < m) && (maze[i][j+1] == '0') && !(visited[i][j+1])) {
                visited[i][j+1] = true;
                s.push(new int[]{i, j+1});
                d = -1;
            }
        }
        else {
            s.pop();
            d = -1;
        }
    }
    return false;
}

}

编辑:现在可以使用了,感谢kendavidson! <3

最佳答案

乍一看,相信您对 StringStackImpl 的看法,我认为您应该只在最后一个 else 中使用 d = -1;。现在您总是将其设置回 -1,因此您只检查 d == 0 条件。据我了解,d是可能的方向,所以应该从03

除此之外,请花一些时间为变量指定有意义的名称: 当节点 [i][j] 尚未被访问时,visited[i][j] 为 true...这是违反直觉的,并且没有帮助其他人或您自己,通过理解您的代码。

您是否被迫使用 char 来表示 ij ?它确实会让代码变得又长又乏味。

关于java - 使用堆栈的迷宫中的老鼠 (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58917713/

相关文章:

algorithm - 从一个集合中找到多个最大不同的二元向量

algorithm - 单一候选人和多个面试官?

java - JTable,在静态上下文中刷新 rowData vector

java - mysql jdbc 驱动程序类是否知道批量执行多个插入?

java - 双端队列的 ArrayDeque 类

Python:一个函数可以返回一个数组和一个变量吗?

c - 为什么对于任何 C 数组,此表达式都包含 a[7] == 7[a]

python - 为什么 Python 列表实现为动态数组而不是环形缓冲区?

java - 如何使用 Apache POI 通过 Google App Engine 读取电子表格?

java - android中语法异常的json如何解析?