Para que el código sea lo más modular posible lo dividimos en varios ficheros cada uno relativo a una parte del problema. También seguimos
esa división en cuanto a la definición de tipos de datos.
Estructuras relacionadas con el proceso de búsqueda de la solución.