Попробуйте и посмотрите, работает ли он.
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;
}
Проблема, с которой вы столкнулись, заключается в том, что вы не гарантировали, что рекурсии не будет разрешено вернуться в том направлении, откуда она пришла.Если вы позволите это, то все пути ведут к выходу, так как разворот является допустимым ходом.Вот где приходят dx
и dy
. Когда вы идете на восток / запад, dx равен + 1 / -1, а когда вы идете на север / юг, dy равен -1 / + 1 соответственно.Большое утверждение if
гарантирует, что вы не пойдете в каком-либо направлении, если вы просто шли с этого пути, например, не двигайтесь на восток, если вы только что двинулись на запад.