¿Que es lo que he hecho?
como es con interfaz grafica tuve que hacerlo en java (aunque me inclino por el c++ pero bueno), para cada casilla hice una clase llamada CASILLA que me hereda de JTextField, esto lo hice para pintar y representar mejor la interfaz. Tengo una clase Laberinto con mi arreglo de casillas (las dimensiones del laberinto), y en este tengo un metodo que me busca un camino, por ahoroa solo he logrado que me busque un camino, mi problema no es que me busque un camino poque ya lo hice, el problema es que necesito que ese camino sea el mas corto, como puedo hacer para determinar cual es el camino mas corto entre los dos puntos. El laberinto es cargado desde un archivo de texto donde * representa camino y # pared, cuando leo el archivo cargo las dimensiones inicializo mi arreglo de casillas pinto la interfaz y el usuario señala los putos de partida y llegada con el mouse, cuando le da a un boton llamo al metodo SOLUCIONAR q me busca el camino.
Como ya dije solucione que encontrara un camino, de hecho puedo conseguir todos los caminos ya que camino recorrido es marcado para q no sea recorrido nuevamente por otro camino nuevo que se vaya a hacer, pero quisiera que el primer camino que me mostrara fuera el mas corto, mi pregunta es como hago para saber cual es el camino mas corto. Aqui dejo la clase CASILLA, LABERINTO.
Clase casilla
- import javax.swing.JTextField;
- import java.awt.Color;
- public class casilla extends JTextField
- {
- private char tipo;
- private boolean recorrida,norecorrida;
- private short id_Unico;
- casilla()
- {
- super();
- tipo='-';
- recorrida=false;
- norecorrida=false;
- id_Unico=0;
- this.setEditable(false);
- this.setBackground(Color.WHITE);
- }
- casilla(short ii)
- {
- super();
- tipo='*';
- recorrida=false;
- norecorrida=false;
- id_Unico=ii;
- this.setEditable(false);
- this.setBackground(Color.WHITE);
- }
- casilla(char t)
- {
- tipo=t;
- recorrida=false;
- norecorrida=false;
- id_Unico=0;
- this.setEditable(false);
- this.setBackground(Color.WHITE);
- }
- public void setTipo(char t){ tipo=t; }
- public void setRecorrida(boolean r){ recorrida=r; }
- public void setNoRecorrida(boolean r){ norecorrida=r; }
- public void setID(short id){ id_Unico=id; }
- public char getTipo(){ return tipo; }
- public boolean getRecorrida(){ return recorrida; }
- public boolean getNoRecorrida(){ return norecorrida; }
- public short getID(){ return id_Unico; }
- }
Clase Laberinto
- import java.awt.Color;
- class laberinto {
- private casilla[][] lab;
- private int n;
- laberinto(int x)
- {
- this.n=x;
- lab=new casilla[x][x];
- }
- public casilla[][] getLaberinto(){ return lab; }
- public casilla getCasilla(int i, int j){ return lab[i][j]; }
- public void setLaberinto(casilla[][] lab2){ lab=lab2; }
- public void setCasilla(casilla c,int x, int y){ lab[x][y]=c; }
- public void setFalso(casilla inicio, casilla fin)
- {
- for(int i=1;i<n;i++)
- {
- for (int j=1;j<n;j++)
- {
- lab[i][j].setRecorrida(false);
- lab[i][j].setNoRecorrida(false);
- if(lab[i][j]!=inicio && lab[i][j]!=fin)
- lab[i][j].setBackground(Color.WHITE);
- }
- }
- }
- boolean solucionar(casilla posicion, casilla anterior, casilla fin, int fila, int columna)
- {
- lab[fila][columna].setRecorrida(true);
- lab[fila][columna].setNoRecorrida(true);
- if(posicion==fin)
- return true;
- boolean encontrado=false;
- //abajo
- if(fila+1 < n)
- {
- if(!lab[fila+1][columna].getNoRecorrida() && lab[fila+1][columna]!=anterior && lab[fila+1][columna].getTipo()!='#')
- {
- encontrado=solucionar(lab[fila+1][columna],lab[fila][columna],fin,fila+1,columna);
- if(encontrado)
- {
- return true;
- }
- lab[fila+1][columna].setNoRecorrida(true);
- lab[fila+1][columna].setRecorrida(false);
- }
- }
- //derecha
- if(columna+1 < n)
- {
- if(!lab[fila][columna+1].getNoRecorrida() && lab[fila][columna+1]!=anterior && lab[fila][columna+1].getTipo()!='#')
- {
- encontrado=solucionar(lab[fila][columna+1],lab[fila][columna],fin,fila,columna+1);
- if(encontrado)
- {
- return true;
- }
- lab[fila][columna+1].setNoRecorrida(true);
- lab[fila][columna+1].setRecorrida(false);
- }
- }
- //arriba
- if(fila-1 > 0)
- {
- if(!lab[fila-1][columna].getNoRecorrida() && lab[fila-1][columna]!=anterior && lab[fila-1][columna].getTipo()!='#')
- {
- encontrado=solucionar(lab[fila-1][columna],lab[fila][columna],fin,fila-1,columna);
- if(encontrado)
- {
- return true;
- }
- lab[fila-1][columna].setNoRecorrida(true);
- lab[fila-1][columna].setRecorrida(false);
- }
- }
- //izquierda
- if(columna-1 > 0)
- {
- if(!lab[fila][columna-1].getNoRecorrida() && lab[fila][columna-1]!=anterior && lab[fila][columna-1].getTipo()!='#')
- {
- encontrado=solucionar(lab[fila][columna-1],lab[fila][columna],fin,fila,columna-1);
- if(encontrado)
- {
- return true;
- }
- lab[fila][columna-1].setNoRecorrida(true);
- lab[fila][columna-1].setRecorrida(false);
- }
- }
- lab[fila][columna].setRecorrida(false);
- return false;
- }
- }
Ayuda por fa, esto es para el miercoles ya hoy es lunes tengo ya 4 dias dando golpes aqui y q va no me da mas el cerebro por mi cuenta necesito ayuda definitivamente jaja......
