Viernes 8 de Noviembre de 2024, 19:50
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
Java
(Moderador:
arielb
) »
¿ Camino mas corto en un Laberinto ?
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: ¿ Camino mas corto en un Laberinto ? (Leído 9000 veces)
kurtjavier
Nuevo Miembro
Mensajes: 15
¿ Camino mas corto en un Laberinto ?
«
en:
Martes 9 de Febrero de 2010, 03:13 »
0
Ok, explic ode una: Me mandaron a hacer un laberinto, leido desde un archivo de texto, que mostrara todos los caminos posibles desde un punto de salida hasta un punto de llegada, y pintara todos los distintos caminos y luego señalara el camino mas corto.
¿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
Código: Java
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
Código: Java
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......
Tweet
fjmc22
Nuevo Miembro
Mensajes: 18
Re: ¿ Camino mas corto en un Laberinto ?
«
Respuesta #1 en:
Martes 9 de Febrero de 2010, 13:08 »
0
haber si te sirve este ejemplo que tenia hecho de un ejercicio de backtraking
Código: Java
public
class
Laberinto
{
public
static
boolean
hayCamino
(
char
[
]
[
]
laberinto
)
{
int
[
]
incrX
=
new
int
[
]
{
1
,
0
,
-
1
,
0
}
;
int
[
]
incrY
=
new
int
[
]
{
0
,
1
,
0
,
-
1
}
;
laberinto
[
0
]
[
0
]
=
'C'
;
boolean
exito
=
buscar
(
laberinto.
length
-
1
,
0
,
0
, laberinto, incrX, incrY
)
;
imprimir
(
laberinto
)
;
return
exito
;
}
private
static
boolean
buscar
(
int
n_1,
int
x,
int
y,
char
[
]
[
]
laberinto,
int
[
]
incrX,
int
[
]
incrY
)
{
boolean
exito
=
false
;
for
(
int
k
=
0
;
k
<
4
&&
!
exito
;
k
++
)
{
int
coordX
=
x
+
incrX
[
k
]
;
int
coordY
=
y
+
incrY
[
k
]
;
if
(
coordX
>=
0
&&
coordX
<=
n_1
&&
coordY
>=
0
&&
coordY
<=
n_1
)
if
(
laberinto
[
coordY
]
[
coordX
]
==
' '
)
{
laberinto
[
coordY
]
[
coordX
]
=
'C'
;
if
(
coordX
==
n_1
&&
coordY
==
n_1
)
exito
=
true
;
else
{
exito
=
buscar
(
n_1, coordX, coordY, laberinto, incrX, incrY
)
;
if
(
!
exito
)
laberinto
[
coordY
]
[
coordX
]
=
' '
;
}
}
}
return
exito
;
}
private
static
void
imprimir
(
char
[
]
[
]
laberinto
)
{
for
(
int
i
=
0
;
i
<
laberinto.
length
;
i
++
)
{
for
(
int
j
=
0
;
j
<
laberinto.
length
;
j
++
)
System
.
out
.
print
(
laberinto
[
i
]
[
j
]
+
" "
)
;
System
.
out
.
println
(
)
;
}
}
}
nacheteibo
Nuevo Miembro
Mensajes: 2
Re: ¿ Camino mas corto en un Laberinto ?
«
Respuesta #2 en:
Jueves 18 de Febrero de 2010, 18:07 »
0
Hola buenas
sabeis como sería el codigo del laberitno para Fortran. Es que estoy aprendiendo a programar en serio y con este ejercicio quiero a consolidar lo ya aprendido.
un saludo
kurtjavier
Nuevo Miembro
Mensajes: 15
Re: ¿ Camino mas corto en un Laberinto ?
«
Respuesta #3 en:
Viernes 19 de Febrero de 2010, 00:17 »
0
Bueno gente hace dias que ya habia terminado el programa se me habia olvidado colocarlo aqui, les dejo la solucion, bueno la que le encontre yo, un laberinto en java usando backtracking, me guarda todos los caminos en una matriz y despues solo verifico cual es el mas corto y listo.
Código: Java
/*
Realizado por Francisco Gallucci */
import
java.awt.Color
;
class
Laberinto
{
private
Casilla
[
]
[
]
lab,solucion
;
private
int
n,pix,piy,pfx,pfy,id_Solucion,max
;
Laberinto
(
Casilla
[
]
[
]
lab2,
int
x
)
{
this
.
n
=
x
;
max
=
n
*
n
;
lab
=
new
Casilla
[
x
]
[
x
]
;
solucion
=
new
Casilla
[
max
]
[
max
]
;
lab
=
lab2
;
id_Solucion
=
0
;
pix
=
piy
=
pfx
=
pfy
=
0
;
}
public
int
getCaminoMasCorto
(
)
{
int
[
]
cantidad
=
new
int
[
id_Solucion
]
;
for
(
int
i
=
0
;
i
<
id_Solucion
;
i
++
)
{
cantidad
[
i
]
=
0
;
for
(
int
j
=
0
;
solucion
[
i
]
[
j
]
!=
null
;
j
++
)
cantidad
[
i
]
++;
}
int
menor
=
0
;
for
(
int
j
=
0
;
j
<
id_Solucion
;
j
++
)
if
(
cantidad
[
j
]
<
cantidad
[
menor
]
)
menor
=
j
;
return
menor
;
}
boolean
solucionar
(
Casilla posicion, Casilla fin,
int
fila,
int
columna,
int
y_Sol
)
{
if
(
posicion
==
fin
)
{
lab
[
fila
]
[
columna
]
.
setRecorrida
(
false
)
;
id_Solucion
++;
return
true
;
}
lab
[
fila
]
[
columna
]
.
setRecorrida
(
true
)
;
boolean
encontrado
=
false
;
//abajo
if
(
fila
+
1
<
n
&&
id_Solucion
<
max
)
{
if
(
!
lab
[
fila
+
1
]
[
columna
]
.
getRecorrida
(
)
&&
lab
[
fila
+
1
]
[
columna
]
.
getTipo
(
)
!=
'#'
)
{
solucion
[
id_Solucion
]
[
y_Sol
]
=
lab
[
fila
]
[
columna
]
;
encontrado
=
solucionar
(
lab
[
fila
+
1
]
[
columna
]
,fin,fila
+
1
,columna,y_Sol
+
1
)
;
if
(
encontrado
)
{
if
(
id_Solucion
<
max
-
1
)
{
int
i
=
0
;
while
(
solucion
[
id_Solucion
-
1
]
[
i
]
!=
null
)
{
solucion
[
id_Solucion
]
[
i
]
=
solucion
[
id_Solucion
-
1
]
[
i
]
;
i
++;
}
}
encontrado
=
false
;
}
else
{
solucion
[
id_Solucion
]
[
y_Sol
+
1
]
=
null
;
lab
[
fila
+
1
]
[
columna
]
.
setRecorrida
(
false
)
;
}
}
}
//derecha
if
(
columna
+
1
<
n
&&
id_Solucion
<
max
)
{
if
(
!
lab
[
fila
]
[
columna
+
1
]
.
getRecorrida
(
)
&&
lab
[
fila
]
[
columna
+
1
]
.
getTipo
(
)
!=
'#'
)
{
solucion
[
id_Solucion
]
[
y_Sol
]
=
lab
[
fila
]
[
columna
]
;
encontrado
=
solucionar
(
lab
[
fila
]
[
columna
+
1
]
,fin,fila,columna
+
1
,y_Sol
+
1
)
;
if
(
encontrado
)
{
if
(
id_Solucion
<
max
-
1
)
{
int
i
=
0
;
while
(
solucion
[
id_Solucion
-
1
]
[
i
]
!=
null
)
{
solucion
[
id_Solucion
]
[
i
]
=
solucion
[
id_Solucion
-
1
]
[
i
]
;
i
++;
}
}
encontrado
=
false
;
}
else
{
solucion
[
id_Solucion
]
[
y_Sol
+
1
]
=
null
;
lab
[
fila
]
[
columna
+
1
]
.
setRecorrida
(
false
)
;
}
}
}
//arriba
if
(
fila
-
1
>
0
&&
id_Solucion
<
max
)
{
if
(
!
lab
[
fila
-
1
]
[
columna
]
.
getRecorrida
(
)
&&
lab
[
fila
-
1
]
[
columna
]
.
getTipo
(
)
!=
'#'
)
{
solucion
[
id_Solucion
]
[
y_Sol
]
=
lab
[
fila
]
[
columna
]
;
encontrado
=
solucionar
(
lab
[
fila
-
1
]
[
columna
]
,fin,fila
-
1
,columna,y_Sol
+
1
)
;
if
(
encontrado
)
{
if
(
id_Solucion
<
max
-
1
)
{
int
i
=
0
;
while
(
solucion
[
id_Solucion
-
1
]
[
i
]
!=
null
)
{
solucion
[
id_Solucion
]
[
i
]
=
solucion
[
id_Solucion
-
1
]
[
i
]
;
i
++;
}
}
encontrado
=
false
;
}
else
{
solucion
[
id_Solucion
]
[
y_Sol
+
1
]
=
null
;
lab
[
fila
-
1
]
[
columna
]
.
setRecorrida
(
false
)
;
}
}
}
//izquierda
if
(
columna
-
1
>
0
&&
id_Solucion
<
max
)
{
if
(
!
lab
[
fila
]
[
columna
-
1
]
.
getRecorrida
(
)
&&
lab
[
fila
]
[
columna
-
1
]
.
getTipo
(
)
!=
'#'
)
{
solucion
[
id_Solucion
]
[
y_Sol
]
=
lab
[
fila
]
[
columna
]
;
encontrado
=
solucionar
(
lab
[
fila
]
[
columna
-
1
]
,fin,fila,columna
-
1
,y_Sol
+
1
)
;
if
(
encontrado
)
{
if
(
id_Solucion
<
max
-
1
)
{
int
i
=
0
;
while
(
solucion
[
id_Solucion
-
1
]
[
i
]
!=
null
)
{
solucion
[
id_Solucion
]
[
i
]
=
solucion
[
id_Solucion
-
1
]
[
i
]
;
i
++;
}
}
encontrado
=
false
;
}
else
{
solucion
[
id_Solucion
]
[
y_Sol
+
1
]
=
null
;
lab
[
fila
]
[
columna
-
1
]
.
setRecorrida
(
false
)
;
}
}
}
lab
[
fila
]
[
columna
]
.
setRecorrida
(
false
)
;
return
false
;
}
}
Omito los metodos para los atributos privados ya saben caules son..........funciono bien con los caso prueba que utilice espero sirva de ejemplo para otros
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
Java
(Moderador:
arielb
) »
¿ Camino mas corto en un Laberinto ?