Actualmente estoy atascado en un proyecto. Mi objetivo es usar el algoritmo de Dijkstra.Ruta más corta de Java Maze 2d int array
Entiendo que comienzo en el punto (0,0) miro los dos nodos junto al punto de inicio y luego me muevo al más pequeño primero y miro los nodos circundantes. Mi laberinto es aleatorio, pero para que sea fácil comenzar, digamos que el siguiente es mi laberinto.
Comenzaré en (0,0) y quiero terminar en (9,9) los números son el nivel PELIGRO y apuntamos a la ruta más segura, no la más corta.
Necesito un empujón para entender cómo configurar esto. Sé que necesito una lista o un camino para estar donde estoy y dónde quiero mirar. pero no sé cómo hacer eso en 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));
}
}
}
}
}
El laberinto está conectado con ninguna pared todas las cajas son habitaciones. He estado tratando de trabajar en esto por tiempo y realmente podría usar un empujón. He visto muchos videos sobre el algoritmo de dijstkra. Actualmente estoy realmente perdido.
He añadido una matriz que guardo el peligro en que se inicia al hacer cada vez nodo 100 millones, pero el nodo de inicio (0,0) es 0.
alguien me puede ayudar con los siguientes pasos entiendo que es la tarea, pero Me estoy quedando sin tiempo y realmente necesito algunos consejos.
ACTUALIZACIÓN:
OK, así que tiene que workingish. Imprime la ruta que toma, pero si encuentra una mejor ruta, imprime tanto alguien puede ayudarme a solucionar esto.
También se rompe si lo hago elemento 100X100 ¿alguien me puede decir por qué? Esta es la última de las "asignaciones de programación" reales. Como puede esperar, esto involucrará gráficos (con un giro); pero, por supuesto, también habrá problemas para resolverlos. Instrucción
imaginar un “juego Dungeon” donde todas las habitaciones están dispuestas en una cuadrícula perfecta con un entorno en el cuadrado. Cada habitación tiene una criatura que presenta un cierto grado de peligro que va desde 0 (inofensivo) a 9 (la evitación sería prudente). El objetivo es encontrar un camino a través de la mazmorra de principio a fin que minimice la cantidad total de peligro.
Cada habitación, a menos que esté en el límite, solo existe en las direcciones arriba, abajo, izquierda, derecha (sin diagonales). La entrada está en la esquina superior izquierda (0,0) y la salida está en la esquina inferior derecha (n-1, n-1).
Enumere todas las "habitaciones" que deben atravesarse, en forma de una ruta de coordenadas de la habitación, desde el principio hasta el final.
Por ejemplo:
(0,0) (1,0) (2,0) (2,1) (2,2) (2,3) (3, 3) (4,3) (4,4)
peligro total = 11 entrada
El archivo de entrada constará de 100 filas de 100 dígitos, 0-9. (Sí, 10,000 es un montón de habitaciones, pero afortunadamente, nuestro intrépido viajero nunca se va de su casa sin una computadora portátil y una colección de Conjuntos Electrónicos de Datos para Todas las Ocasiones recibidos en el intercambio de regalos navideños del año pasado, probablemente fue regalado nuevamente.) *
* Para esta tarea, deberá generar sus propios datos de prueba. Es por eso que no voy a este tipo de fiestas ... Salida
El programa debe escribir la salida en un archivo (en el formato ilustrado arriba, incluyendo el resultado de "peligro total"). Gracias.
Update2: i encontrado un error en mi codificación tengo
if(min>copy[x][y]){
min=copy[x][y];
holdx=x;
holdy=y;
}
Esto hará que sea a prueba todos los caminos que está ahí en un momento dado mi camino más corto es más grande que el otro camino ¿cómo puedo solucionar este ?
¿Qué es lo que me estoy perdiendo? ACTUALIZACIÓN Terminé esto gracias por la MUY PEQUEÑA ayuda.
No sé cómo construirlo. ¿Me pueden ayudar a construirlo a partir de los resultados? –
Comenzando en el final del laberinto, las etiquetas tentative_distance_value representan la distancia más corta al origen. Puede construir la ruta agregando ávidamente el nodo con la etiqueta más el costo de pasar de ese espacio a su espacio. Como el costo de un espacio es independiente del límite de su problema (es el peligro del espacio, no la dirección particular desde la que ingresó), puede usar la etiqueta. – ccoakley
Usted está justo después de que encuentre el costo para llegar al final. Solo agrego las habitaciones más pequeñas al lado y sigo hasta que toco (0,0). Gracias –