[ Foro de Pascal ]

Sopa de letras

30-Sep-2010 22:18
Enzo Hernan chavez
2 Respuestas

hola a todos....
Otra vez yo con un problema, a ver si alguien me puede ayudar.
El problema es el siguiente, dada una sopa de letras y una lista de palabras tengo que mostrar la cantidad de palabras que se encuentran en dicha sopa de letras.
Alguien me puede ayudar no se como buscar las palabras dentro de la matriz de letras.


01-Oct-2010 01:33
Antonio P.G.

Hola Enzo.

Bueno, para empezar y desde mi punto de vista, necesitas (como archivos complementarios al programa):

- Un archivo de texto con la sopa de letras, que tú dices que sería una matriz de letras.
- Un archivo de texto con las posibles palabras que se puedan encontrar, es decir, una base de palabras "solución".Esto podría estar contenido en el primer archivo, de forma que lo tuviésemos todo en uno.

Lo primero de todo, sería definir "el juego". ¿Las palabras se leen horizontal y verticalmente? ¿O también vale en diagonal? ¿Se puede sólo de izquierda a derecha, o se incluye además de derecha a izquierda?

Esto anterior depende de ti (o del enunciado), ahora bien, tratándose de encontrar el algoritmo, a veces es la misma idea pero se alarga más.

Supongo que la matriz sería de arrays, me refiero a que serán variables estáticas y no dinámicas.

Vaya, es muy tarde y mañana madrugo. Te aconsejo que diseñes un algoritmo tú a mano, es decir, que cojas una sopa de letras (de una revista, periódico o Internet) y dijeses "soy un ordenador y tengo que resolverlo". Eso de pasar la vista flotando por la sopa "a ver si algo me llama la atención" no vale para una máquina.

Yo pensaría en algo como:

"Cojo la primera letra. La uno con la siguiente. Si no es palabra, uno otra letra más. Si se acaba la línea y no es palabra, pruebo uniendo esta vez horizontalmente hacia abajo. (... aquí haría todas las posibilidades...). Si he terminado con esta letra, y me quedan palabras por encontrar, paso a la letra de al lado."

Por cierto, también habría otra forma, mediante el uso de strings.

Ahora bien, que yo sepa (y no sé mucho) la máquina no "sabe palabras" de por sí. Es como un humano: una persona no puede resolver una sopa de letras si no conoce todas las palabras dentro de ésta.

¡Buenas noches y ánimo!


08-Oct-2010 00:32
Nacho Cabanes (+32)

La forma más sencilla (en mi opinión) de ver si unas palabras permanecen a una sopa de letras es comprar si una frase aparece dentro de otra (con funciones como "pos"), pero eso tiene una dificultad:

La cadena que buscas "dentro" suele ser realmente una cadena como tal, ya sea introducida por el usuario o leida de fichero. En cambio, las cadena "en la que buscas" la tienes que construir "a mano":

- Si tienes un array bidimensional de caracteres, siempre deberás construir las cadenas, "sumando" (concatenando) letra a letra.

- Si tu sopa de letras es un "array de strings", es fácil mirar en una línea horizontal de derecha a izquierda, pero tienes que construirte tú la cadena si quieres mirar en orden contrario, o en vertical o en diagonal.

En general, el algoritmo debería ser algo como

Para cada una de las filas
 Si pertenece palabra a fila entonces palabraEncontrada = verdad

Si no palabraEncontrada entonces
 Para cada una de las filas
   Formar filaInvertida
   Si pertenece palabra a filaInvertida entonces palabraEncontrada = verdad

Si no palabraEncontrada entonces
 Para cada una de las columnas
   Formar columna
   Si pertenece palabra a columna entonces palabraEncontrada = verdad

...


Eso de "formar filaInvertida" y "formarColumna", que puede sonar "demasiado de alto nivel", debería ser poco más que un "for":

frase := '';
for i := ancho downto 1 do
 frase := frase + letra[i]

(nuevamente, la forma exacta depende de si tienes un array de strings, un array bidimensional de caracteres o alguna otra estructura).


Si además debes mostrar donde está la palabra, no te bastaría con memorizar si la palabra aparece o no, sino que tendrías que guardar también la posición y la dirección, para poder destacarla.

Suerte!






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)