Resolución problema laberinto

jmbegara

Lanero Regular
9 Mar 2009
6
Hola a todos... A ver:
Estoy haciendo (o al menos pretendo) una aplicación en la que necesito realizar una función o procedimiento que me permita encontrar un camino entre un punto y otro, concretamente, si tengo una tabla de excel, tratar de ir de una celda inicial a otra final pasando celdas con el texto "T", y en caso que no sea posible, que no me avise
ejemplo: Desde A1 hasta D4
T A A T
T T A T
A T A A
A T T T
necesitaría saber cómo tendría que programarlo en visual basic como si fuera una matriz, supongo, y ya no tendría ningún problema a adaptarlo al excel

Espero haberme explicado suficientemente bien... Muchas gracias de antemano

Jose
 
Hola jmbegara,

Te comento lo que hice: arme una macro que se ejcuta al clickear en un boton. Lo que hace es elegir a que celda se va a mover, primero se fija si en la celda diagonal inferior hay una "T" (ese seria el camino mas corto, la diagonal). Si esta la "T", entonces se mueve a esa celda. De lo contrario busca a la derecha y abajo, y si existe la "T", se mueve a esas celdas.
El boton hay que clickearlo hasta llegar al final, un click es un movimiento, no es un proceso que solo va recorriendo toda la matriz. Me parecio mejor para entenderlo mas facilmente, solo tendrias que agregar un bucle con una condicion (si no encuentra mas letras, entonces se termino el recorrido)

Private Sub CommandButton1_Click()
Dim Fila As Integer
Dim Col As Integer

Fila = ActiveCell.Row
Col = ActiveCell.Column

Dim FilaAbj As Integer
Dim FilaArr As Integer
Dim ColIzq As Integer
Dim ColDer As Integer

FilaAbj = Fila + 1
FilaArr = Fila - 1
ColIzq = Col - 1
ColDer = Col + 1

'si la celda inmediata en la diagonal inferior tiene una T, se mueve a esa celda
If Hoja1.Cells(FilaAbj, ColDer) = "T" Then
Hoja1.Cells(FilaAbj, ColDer).Select
Exit Sub
End If

'si la celda inmediata a la derecha tiene una T, se mueve a esa celda
If Hoja1.Cells(Fila, ColDer) = "T" Then
Hoja1.Cells(Fila, ColDer).Select
Exit Sub
End If

'si la celda inmediata inferior tiene una T, se mueve a esa celda
If Hoja1.Cells(FilaAbj, Col) = "T" Then
Hoja1.Cells(FilaAbj, Col).Select
Exit Sub
End If
End Sub

Si me pasas tu mail te mando el excel.

Espero te sirva, cualquier cosa avisame.
 
estesua47 dijo:
Lo que hace es elegir a que celda se va a mover, primero se fija si en la celda diagonal inferior hay una "T" (ese seria el camino mas corto, la diagonal). Si esta la "T", entonces se mueve a esa celda. De lo contrario busca a la derecha y abajo, y si existe la "T", se mueve a esas celdas.

Hay un detalle con ése algoritmo. Me parece que asume que las celdas inicial y final siempre serán la superior izquierda e inferior derecha, respectivamente. O al menos que el camino siempre va bajando, y hacia la derecha.

No conozco el problema original que se trata de resolver en Excel. Por lo tanto no puedo decir si esa solución sería suficiente, pero lo dudo. Incluso si se agregan las demás direcciones al código, hay muchos casos que pueden hacer que el algoritmo se quede varado o dando vueltas, aunque exista un posible camino.

Creo que la solución es un poco más compleja. ;)

Ah, y podría estar equivocado, pero algo me dice que no es válido moverse diagonalmente.
 
Estimado Cowboy,

El algoritmo asume un muchas de cosas:
.- Que nunca va a encontrar un camino muerto
.- Que siempre hay que ir de arriba hacia abajo (como vos dijiste)
.- Que el camino lo marcan las "T", jeje

Todas estas cosas las asumo por lo que entiendo del problema que quiere resolver jmbegara. Pero sentite libre de modificarlo... para eso es el foro. Es mas, podríamos definir los requerimientos y rehacerlo, o jmbegara podría explayarse sobre como seguir...
Insisto en que me gustaría saber qué características pensas que debería tener el algoritmo y codificarlo.... el código va a ser un lenguaje común !

saludos.
 
Bueno yo leí el enunciado y eso fue lo que entendí. No estoy inventando nada. Mejor esperamos a que el interesado nos aclare. ;)
 
Madre mía, qué maravilla... muchas gracias a los dos, estesua47 y DCowboy

A ver, os aclaro un poco... estesua47, mi cuenta de correo es jmbegara@hotmail.com, para que me envies el código y poder probarlo... A primera vista se parece mucho al que yo ya había intentado pero que no me va bien porque en cuanto no puede continuar buscando "T" se queda quieto, cuando lo que debería hacer es volver atrás buscando otro camino

Además, tal y como dice DCowboy (y que yo no había caido en la cuenta), puede ocurrir que la celda origen y la celda final tengan posiciones relativas diferentes, es decir, el camino podría ir en cualquier dirección. Aparte, efectivamente, no se puede ir en diagonal sino solo en vertical y hoizontal

La función final tendría que tener como argumentos las celdas origen y destino y como salida el número de celdas recorridas

De nuevo, muchas gracias por vuestra ayuda desinteresada
 
Hola. Aclarado lo anterior, vuelvo a preguntar:

DCowboy dijo:
en qué punto estás exactamente? Ya conviertes la tabla de Excel en una matriz en VB?

Una matriz de valores booleanos sería un buen punto de partida. Y aclaro que el "camino" puede ser algo más complejo de lo esperado. Por eso quisiera saber qué es lo que pretendes resolver. Cuál es el objetivo final de la hoja electrónica?
Escrito desde www.LANeros.mobi (Opera/9.60 (J2ME/MIDP; Opera Mini/4.0.10406/670; U; en) Presto/2.2.0)
 
Explico exactemente el problema:

La hoja consiste en un mapa grande incrustado detrás de la hoja de cálculo. En el mapa hay maracadas varias ciudades de manera que algunas celdas coinciden con ellas. Aparte habrá celdas que coincidan con tierra y otras con agua.

Lo que necesito es una función en la que yo introduzco la celda correspondiente a un pais origen, la celda correspondiente a otro país destino y que me devuelva el número de celdas recorridas por el camino más corto, evitando las que contengan agua, y si no es posible llegar por tierra que salga un mensaje indicándolo.

Gracias de nuevo
 
Ya sabía yo que había un mapa involucrado en el asunto....

Mándame un mensaje si quieres. Ya he trabajado con eso antes.
 

Los últimos temas