Attualmente sono bloccato su un progetto. Il mio obiettivo è usare l'algoritmo di Dijkstra.Percorso minimo labirinto Java 2d int array
Capisco che parto dal punto (0,0). Guardo i due nodi vicino al punto di partenza e poi mi muovo verso il più piccolo e guardo i nodi circostanti. Il mio labirinto è casuale, ma per rendere più facile l'inizio, lascia che il seguente sia il mio labirinto.
Inizio a (0,0) e voglio terminare a (9,9) i numeri sono il livello PERICOLO e miriamo al percorso più sicuro non proprio il più breve.
Ho bisogno di una spinta per capire come impostare questo. So che ho bisogno di una lista o di un percorso per mantenere dove sono e dove voglio guardare. ma non so come farlo in Java.
import java.awt.Point;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class solver {
/**
* @param args
*/
public static int[][]maze;
public static int[][]openlist;
public static int[][]closed;
public static int[][]copy;
public static int danger;
public static int size=100;
static int Max=9;
static int Min=0;
public static List path = new ArrayList();
public static void main(String[] args) {
// TODO Auto-generated method stub
maze = new int[size][size];
openlist = new int[size][size];
closed = new int[size][size];
copy = new int[size][size];
filler(maze);
copy=dijstkra();
printer(maze);
//printer(copy);
EDSfAO(maze,0,0);
printer(openlist);
printer(copy);
}
private static Boolean notwall(int i, int j){
if((i>maze.length-1)||(j>maze.length-1)||(i<0)||(j<0))
{return false;}
return true;}
private static int[][] dijstkra(){
for(int i=0;i<maze.length;i++){
for(int j=0;j<maze.length;j++){
copy[i][j]=100000000;
}}
copy[0][0]=0;
return copy;
}
private static void EDSfAO(int[][] maze,int i,int j){
int min=100000000;
int holdx = 0;
int holdy = 0;
openlist[i][j]=1;
danger=copy[i][j];
if(i==maze.length-1&&j==maze.length-1){
printer(copy);
for(holdx=0;holdx<path.size();holdx++){
System.out.print(path.get(holdx));
}
}
else{
if(notwall(i+1,j)&&openlist[i+1][j]!=1){
copy[i+1][j]=danger+maze[i+1][j];
} if(notwall(i,j+1)&&openlist[i][j+1]!=1){
copy[i][j+1]=danger+maze[i][j+1];
} if(notwall(i,j-1)&&openlist[i][j-1]!=1){
copy[i][j-1]=danger+maze[i][j-1];
} if(notwall(i-1,j)&&openlist[i-1][j]!=1){
copy[i-1][j]=danger+maze[i-1][j];
}
for(int x=0;x<maze.length;x++){
for(int y=0;y<maze.length;y++){
if(openlist[x][y]!=1){
if(min>copy[x][y]){
min=copy[x][y];
holdx=x;
holdy=y;
}
}
}}
moveToPosition(holdx,holdy);
}
}
private static void moveToPosition(int x, int y) {
openlist[x][y]=1;
path.add("("+x+","+y+")");
openlist[x][y]=1;
EDSfAO(maze,x,y);
}
private static void printer(int[][] maze) {
// TODO Auto-generated method stub
for(int i=0;i<maze.length;i++){
for(int j=0;j<maze.length;j++){
System.out.print("["+maze[i][j]+"]");
}
System.out.println();
}
}
public static void filler(int[][] maze){
for(int i=0;i<maze.length;i++){
for(int j=0;j<maze.length;j++){
//If i=0 AND j=0 then maze[0][0]= 0(start) OR i= maze.length-1 AND j= maze.length-1 then maze[maze.length][maze.length]=0
if((i==0 && j==0) || (i==maze.length-1 && j==maze.length-1)){
maze[i][j]=0;
}else{
maze[i][j]=Min + (int)(Math.random() * ((Max - Min) + 1));
}
}
}
}
}
Il labirinto è collegato senza pareti tutte le scatole sono stanze. Ho cercato di lavorare su questo per tempo e potrei davvero usare una spinta. Ho visto molti video sull'algoritmo di dijstkra che attualmente mi sto davvero perdendo.
ho aggiunto un array che io continuo il pericolo in esso inizia facendo mai nodo 100000000 ma il nodo di partenza (0,0) è 0.
Qualcuno mi può aiutare con i prossimi passi Capisco che è compiti a casa, ma Sto esaurendo il tempo e ho davvero bisogno di alcuni suggerimenti.
UPDATE:
OK così ce l'ho workingish. Stampa il percorso necessario ma, se trova un percorso migliore, stampa entrambi, qualcuno può aiutarmi a risolvere questo problema.
Inoltre si rompe se faccio 100X100 elemento qualcuno può dirmi perché? Questo è l'ultimo dei veri "incarichi di programmazione". Come ci si potrebbe aspettare, questo coinvolgerà i grafici (con una svolta); ma naturalmente ci saranno anche dei problemi di risoluzione dei problemi. istruzioni
immaginare un “gioco Dungeon” dove tutte le camere sono disposte in una griglia perfetta con in un ambiente quadrato. Ogni stanza ha una creatura che presenta un certo grado di pericolo che va da 0 (innocuo) a 9 (evitare sarebbe prudente). L'obiettivo è quello di trovare un percorso attraverso il dungeon dall'inizio alla fine che riduca al minimo la quantità complessiva di pericolo.
Ogni stanza, a meno che non vi sia un limite, esiste solo nelle direzioni su, giù, sinistra, destra (nessuna diagonale). L'ingresso è in alto a sinistra (0,0) e l'uscita è in basso a destra (n-1, n-1).
Elenca tutte le "stanze" che devono essere attraversate, sotto forma di un percorso di coordinate stanza, dall'inizio alla fine.
Ad esempio:
(0,0) (1,0) (2,0) (2,1) (2,2) (2,3) (3, 3) (4,3) (4,4)
pericolo totale = 11 ingresso
Il file di input sarà composto da 100 righe di 100 cifre, 0-9. (Sì, 10.000 sono un sacco di stanze, ma fortunatamente il nostro intrepido viaggiatore non esce mai di casa senza un computer portatile e una raccolta di set di dati elettronici per tutte le occasioni ricevute nello scambio di regali per le vacanze dello scorso anno, probabilmente riconfermato.) *
* Per questo compito, è necessario generare i propri dati di test. Questo è il motivo per cui non vado a questi tipi di feste ... Uscita
Il programma dovrebbe scrivere l'output in un file (nel formato illustrato sopra, incluso l'output "pericolo totale"). Grazie.
UPDATE2: Ho trovato un errore nel mio codice ho
if(min>copy[x][y]){
min=copy[x][y];
holdx=x;
holdy=y;
}
In questo modo sarà verificare ogni percorso che è lì in un determinato punto il mio percorso più breve è più grande, allora l'altro percorso come posso risolvere questo ?
Cosa mi manca? AGGIORNAMENTO Ho finito questo grazie per l'aiuto MOLTO PICCOLO.
Non so come anche costruirlo. puoi aiutarmi a costruirlo dai risultati? –
Partendo dalla fine del labirinto, le etichette del valore provvisorio_distanza rappresentano la distanza più breve dall'origine. Puoi costruire il percorso aggiungendo avidamente il nodo con l'etichetta più il costo di spostarti da quello spazio al tuo spazio. Dal momento che il costo di uno spazio è indipendente dal limite del tuo problema (è il pericolo dello spazio, non da quale particolare direzione hai inserito), puoi semplicemente usare l'etichetta. – ccoakley
Hai ragione dopo aver trovato il costo per arrivare alla fine. Aggiungo solo le stanze più piccole della porta accanto e proseguo finchè non colpisco (0,0). Grazie –