Как объяснено в ссылке, опубликованной Ole VV while
цикл проверял условие перед выполнением блока.do-while
проверяет условие после выполнения блока.Это означает, что переход от одной формы к другой, требует изменения условия.Однако, прежде чем пытаться сравнить два решения, одно из которых реализовано с использованием while
, а другое с использованием do-while
, убедитесь, что вы начали с правильного решения.Размещенное решение возвращает false, если лабиринт изменен на:
int[][] maze = {
{0, 0, 1, 0, 0},
{0, 1, 0, 0, 0},
{0, 0, 0, 1, 0},
{1, 1, 0, 1, 1},
{0, 0, 0, 0, 0},
};
(с использованием одинаковых начальной и конечной точек).Насколько я понимаю, это должно вернуть истину.
Похоже, что это решение работает лучше (хотя может потребоваться дополнительное тестирование):
public boolean hasPath(int[][] maze, int[] start, int[] destination) {
ArrayDeque<int[]> queue = new ArrayDeque<>();
int[][] directions = {{1,0},{-1,0},{0,1},{0,-1}};
queue.offer(start);
while(!queue.isEmpty()) {
int [] loc = queue.poll();
int x = loc[0];
int y = loc[1];
if(x == destination[0] && y == destination[1]){
return true;
}
for(int[] dir : directions) {
while(x+dir[0]>= 0 && y+dir[1] >= 0 && x+dir[0] < maze.length && y+dir[1] <
maze[0].length && maze[x+dir[0]][y+dir[1]] == 0){
x += dir[0];
y += dir[1];
if(!queue.contains(new int[] {x,y})) {
queue.offer(new int[] {x,y});
maze[x][y] = 2;
}
}
}
}
return false;
}