Quello che sto cercando di fare è contare quanti spostamenti ci vogliono per raggiungere l'obiettivo utilizzando il percorso più breve. Deve essere fatto utilizzando una ricerca per ampiezza prima. Metto la griglia 8x8 in un array 2d che è riempito con uno di quattro caratteri, E per vuoto (può spostarsi in questi punti), B per bloccato (non può spostarsi qui), R per robot (punto di partenza) o G per obiettivo. L'algoritmo doveva controllare gli spazi mobili nell'ordine in alto, a sinistra, a destra, poi in basso, che credo di aver fatto correttamente. Dopo aver controllato un nodo, cambia il suo contenuto in una "B". Se non è possibile raggiungere l'obiettivo, è necessario restituire 0.Ricerca in ampiezza su una griglia 8x8 in Java
Ho modificato il mio codice per implementare quello che mi ha detto Kshitij e funziona perfettamente. Ero troppo stanco per vedere che non stavo inizializzando la mia coda dopo ogni nuovo set di dati lol. Grazie per l'aiuto!
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;
}
Sembra legittimo, grazie per l'intuizione. Presumo che essere in grado di stampare i percorsi validi avrebbe funzionato allo stesso modo, aggiungendo semplicemente la direzione spostata come valore nella coda. In modo che dopo popping (1,0) la coda sarebbe simile a questa: {(0,2), 2, R}. In sostanza questo dovrebbe permettermi di stampare il percorso una volta raggiunto l'obiettivo, corretto? – Ethan
Modificherò la mia risposta per rispondere a quello –
@KshitijMehta cosa succede all'elemento di coda {(0, 1), 1} dove non ci sono figli percorribili ... quando lo schiocchi O rimane in coda? –