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



我们得到一个2D字符数组,从给定点开始,我们必须找到一个"出口",即给定矩阵周长中的"0"。如果找到路径,该程序将返回true,稍后在主方法中运行该程序时,它将打印一条消息。我们只能向上、向左、向下或向右移动到附近的"0"。我已经尝试过了,但是我遇到了一个内存错误,这可能意味着我陷入了一个无限循环。我尝试使用我使用Nodes制作的Stack来实现这个项目,我也使用泛型来实现它,比如:

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]为真。。。这是违反直觉的,对他人或您自己理解代码都没有帮助。

ij是否强制使用char?它确实会让代码变得冗长乏味。

最新更新