Lo que trato de hacer es contar cuántos movimientos se necesitan para llegar a la meta utilizando la ruta más corta. Debe hacerse usando una primera búsqueda de amplitud. Puse la grilla de 8x8 en una matriz de 2d que está llena con uno de cuatro caracteres, E para vacía (puede moverse en estos puntos), B para bloqueada (no se puede mover aquí), R para robot (punto de inicio) o G para el objetivo El algoritmo tenía que buscar espacios movibles en el orden arriba, izquierda, derecha, y abajo, lo cual creo que he hecho correctamente. Después de comprobar un nodo, cambia su contenido a 'B'. Si no se puede alcanzar el objetivo, se debe devolver 0.Búsqueda en primer lugar en una grilla de 8x8 en Java
He cambiado mi código para implementar lo que Kshitij me dijo, y funciona muy bien. Estaba demasiado cansado para ver que no estaba inicializando mi cola después de cada nuevo conjunto de datos jajaja. ¡Gracias por la ayuda!
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;
}
Parece legítimo, gracias por la información. Supongo que poder imprimir las rutas viables funcionaría de la misma manera, simplemente agregando la dirección movida como un valor en la cola. Entonces, después de hacer popping (1,0), la cola se vería así: {(0,2), 2, R}. En esencia, esto debería permitirme imprimir el camino una vez que se alcanza el objetivo, ¿correcto? – Ethan
Voy a editar mi respuesta para responder a eso –
@KshitijMehta qué pasa con el elemento de la cola {(0, 1), 1} donde no hay ningún childeren viable ... ¿cuándo lo sacas O permanece en la cola? –