viernes, 29 de marzo de 2013

Diferentes caminos en la malla (15)


otro de los problemas resueltos de project euler:
Enunciado problema 15 de Project Euler:

Starting in the top left corner of a 2×2 grid, and only being able to move to the right and down, there are exactly 6 routes to the bottom right corner.

How many such routes are there through a 20×20 grid?


En esta ocasión, he optado por una función recursiva, que aunque no es el más rápido (solo hay que comprobar los tiempos de ejecución) es la que más rápido se implementa, y a mi parecer, siempre quedan bonitas este tipo de funciones. La variable que cuenta caminos, es un vector de enteros, lo que nos permite almacenar mayores cantidades.
Recominedo programar este rpograma por uno mismo, puesto que a mi parecer, constituye un más que buen ejemplo del uso de las funciones recursivas. Estas funciones son poco útiles, pero ayudan a aprender a pensar, a razonar, lo cual es fundamental a la hora de programar.


#include <stdio.h>

int const max=20;/*máximo de dígitos que se van a almacenar*/

int col,fil;

int caminos[max+1];

int c,f;


void mover(int a, int b, int cam[], int fl, int cl);


int main(void)
{
    for (c=1;c<=max;c++) caminos[c]=0;
    printf("Numero de filas: "); scanf("%i",&fil);
    printf("Numero de columnas: "); scanf("%i",&col);
    
    c=f=0;
    
    mover(f,c,caminos,fil,col);
    
    printf("\nEl numero de rutas es:\n");
    for (c=1;c<=max;c++) printf("%i", caminos[c]);
    scanf("%i");
    return 0;    
}

void mover(int a, int b, int cam[], int fl, int cl)
{  
    int cont;
    
    if (b<cl)
    {
       mover(a,b+1,cam,fl,cl);
    }
    if (a<fl)
    {
       mover(a+1,b,cam,fl,cl);
    }
    if ((a==fl)&&(b==cl)) 
    {
       cam[max]++;
       for (cont=max;cont>=1;cont--) 
       {
           if (cam[cont]==10)
           {
              cam[cont-1]++;
              cam[cont]=0;
}}}}

Los datos de ejecución en mi PC son los siguientes para que os hagáis una idea:
Intel I7 3770-k a 3.5GHz Trabajando dos nucleos ---> 40 minutos aprox.

Aquí la versión optimizada: http://cypascal.blogspot.com.es/2013/03/problema-15-project-euler-segunda-manera.html la cual la cual ya no utiliza una función recursiva, pero por contra, su extensión es mucho mayor. Se pueden comparar resultados.

Un saludo.

No hay comentarios:

Publicar un comentario