private boolean solveMaze(Position p){ if(!p.isOnMaze(this)) { return false; } if(p.equals(goal)) { return true; } if(!map[p.getRow()][p.getColumn()].equals(MazeSymbol.OPEN)) { // See NOTE 1 return false; } map[p.getRow()][p.getColumn()] = MazeSymbol.PATH; solutionPath.add(p); if(solveMaze(p.positionAbove())) return true; // See NOTE 2 if(solveMaze(p.positionLeft())) return true; if(solveMaze(p.positionBelow())) return true; if(solveMaze(p.positionRight())) return true; solutionPath.remove(solutionPath.size() - 1); // See NOTE 3 map[p.getRow()][p.getColumn()] = MazeSymbol.DEAD_END; return false; }