因此,我创建了一个迷宫求解器,该迷宫求解器可以找到到达终点的路线,但是我该怎么做,以便如果一条路线通向死角,则将其重写为空白。下面是我的求解器迷宫方法。
谢谢大家,@ Leo Aso的解决方案成功了。
private boolean solveMaze(int coorda, int coordb) {
return solveMaze(coorda, coordb, 0, 0);
}
private boolean solveMaze(int coorda, int coordb, int dx, int dy) {
switch (myMaze[coorda][coordb]) {
case '#': case 'X': return false;
case 'E': return true;
}
myMaze[coorda][coordb] = 'X';
if (dx >= 0 && solveMaze(coorda + 1, coordb, +1, 0) || // W
dx <= 0 && solveMaze(coorda - 1, coordb, -1, 0) || // E
dy >= 0 && solveMaze(coorda, coordb + 1, 0, +1) || // S
dy <= 0 && solveMaze(coorda, coordb - 1, 0, -1)) { // N
return true;
}
myMaze[coorda][coordb] = ' ';
return false;
}
答案 0 :(得分:1)
尝试一下,看看是否可行。
private boolean solveMaze(int coorda, int coordb) {
return solveMaze(coorda, coordb, 0, 0);
}
private boolean solveMaze(int coorda, int coordb, int dx, int dy) {
switch (myMaze[coorda][coordb]) {
case '#': case 'X': return false;
case 'E': return true;
}
myMaze[coorda][coordb] = 'X';
if (dx >= 0 && solveMaze(coorda + 1, coordb, +1, 0) || // W
dx <= 0 && solveMaze(coorda - 1, coordb, -1, 0) || // E
dy >= 0 && solveMaze(coorda, coordb + 1, 0, +1) || // S
dy <= 0 && solveMaze(coorda, coordb - 1, 0, -1)) { // N
return true;
}
myMaze[coorda][coordb] = ' ';
return false;
}
您遇到的问题是,您不能确保不允许递归返回原先的方向。如果允许,则 all 路径均会导致退出,因为转身是有效的举动。这就是dx
和dy
进入的地方。当您向东/向西移动时,dx为+ 1 / -1,而当您向北/向南移动时,dy为-1 / + 1。大if
语句可确保您不会只是朝那个方向前进,例如如果您只是向西移动,就不要向东移动。
答案 1 :(得分:-1)
您也许可以编写一个if语句来了解什么是死胡同。因此,它将主要搜索三个不同方向为“#”的位置。然后,您可能会有一条if语句,如果deadend为true,则追溯步骤并删除x值。