То, что я пытаюсь сделать, - подсчитать, сколько ходов требуется для достижения цели с использованием кратчайшего пути. Это нужно сделать, используя первый поиск по ширине. Я поместил сетку 8x8 в 2d-массив, который заполнен одним из четырех символов, E для пустого (может перемещаться в эти пятна), B для заблокированных (не может двигаться здесь), R для робота (начальная точка) или G для цели. Алгоритм должен был проверять подвижные пробелы в порядке вверх, влево, вправо, затем вниз, что, я считаю, я сделал правильно. После проверки узла он изменяет свое содержимое на «B». Если цель не может быть достигнута, 0 следует вернуть.Первый поиск по сетке 8x8 в Java
Я изменил свой код, чтобы реализовать то, что сказал мне Kshitij, и он прекрасно работает. Я просто слишком устал, чтобы убедиться, что я не инициализировал свою очередь после каждого нового набора данных lol. Спасибо за помощь!
public static int bfSearch(){
Queue <int []> queue = new LinkedList <int []>();
int [] start = {roboty,robotx,0};
queue.add(start);
while (queue.peek() != null){
int [] array = queue.remove();
if(array[0]-1 >= 0 && grid[array[0]-1][array[1]] != 'B'){
if (grid[array[0]-1][array[1]] == 'G'){
return array[2]+1;
}
else{
grid[array[0]-1][array[1]] = 'B';
int [] temp = {array[0]-1, array[1], array[2]+1};
queue.add(temp);
}
}
if(array[1]-1 >= 0 && grid[array[0]][array[1]-1] != 'B'){
if (grid[array[0]][array[1]-1] == 'G'){
return array[2]+1;
}
else{
grid[array[0]][array[1]-1] = 'B';
int [] temp = {array[0], array[1]-1, array[2]+1};
queue.add(temp);
}
}
if(array[1]+1 <= 7 && grid[array[0]][array[1]+1] != 'B'){
if (grid[array[0]][array[1]+1] == 'G'){
return array[2]+1;
}
else{
grid[array[0]][array[1]+1] = 'B';
int [] temp = {array[0], array[1]+1, array[2]+1};
queue.add(temp);
}
}
if(array[0]+1 <= 7 && grid[array[0]+1][array[1]] != 'B'){
if (grid[array[0]+1][array[1]] == 'G'){
return array[2]+1;
}
else{
grid[array[0]+1][array[1]] = 'B';
int [] temp = {array[0]+1, array[1], array[2]+1};
queue.add(temp);
}
}
}
return 0;
}
Кажется законным, спасибо за понимание. Я предполагаю, что возможность печатать жизнеспособные пути будет работать одинаково, просто добавив направление, перемещенное как значение в очереди. Чтобы после появления (1,0) очередь выглядела бы так: {(0,2), 2, R}. По сути, это должно позволить мне печатать путь после достижения цели, правильно? – Ethan
Я отредактирую свой ответ, чтобы ответить на этот вопрос –
@KshitijMehta, что происходит с элементом очереди {(0, 1), 1}, где нет жизнеспособного childeren ... когда вы его всплываете ИЛИ он остается в очереди? –