viernes, 29 de marzo de 2013

Diferentes caminos en una malla (15 Segunda manera)

Problema 15 Project Euler

En respuesta al post: http://cypascal.blogspot.com.es/2013/03/problema-15-project-euler.html.
Aquí les traigo una manera muchísimo más eficiente de calcularlo, no tarda ni 1 segundo.
El mallado está representado por un array bidimensional, y en cada punto de este mallado se guardan el número de caminos que llegan. Este número se suma a las casillas adyacentes a ella, tanto a la derecha como por abajo, hasta que se llega a la última casilla.
Las cantidades de caminos también se han representado con arrays, para evitar el desbordamiento.


/*POR EL MÉTODO DE LOS CAMINOS*/

#include <stdio.h>

int const max=25;
int const dig=20;/*cantidad de digitos de la cifra de caminos*/

int main(void)
{
    int col, fil, TGrid, cif, aux;
    int Grid[max][max][dig+1];
    
    printf("Introducir el tamano del tablero: "); scanf("%i",&TGrid);
    
    /*Inicializar Grid*/
    for (col=0;col<=TGrid;col++) 
    for (fil=0;fil<=TGrid;fil++) 
    for (cif=0;cif<=dig;cif++) 
        Grid[fil][col][cif]=0;
    
    Grid[0][0][dig]=1;/*Casilla de inicio*/
    
    for (col=0;col<=TGrid;col++)
    for (fil=0;fil<=TGrid;fil++)
    {   
        if ((fil+1)<=TGrid)
           for (cif=dig;cif>=0;cif--)
           {
               aux=(Grid[fil+1][col][cif]+Grid[fil][col][cif])%10;
               Grid[fil+1][col][cif-1]=(Grid[fil+1][col][cif]+Grid[fil][col][cif])/10+Grid[fil+1][col][cif-1];
               Grid[fil+1][col][cif]=aux;
           }
        if ((col+1)<=TGrid) 
           for (cif=dig;cif>=0;cif--)
           {
               aux=(Grid[fil][col+1][cif]+Grid[fil][col][cif])%10;
               Grid[fil][col+1][cif-1]=(Grid[fil][col+1][cif]+Grid[fil][col][cif])/10+Grid[fil][col+1][cif-1];
               Grid[fil][col+1][cif]=aux;
           }
    }
    printf("El numero de caminos es: ");
    for (cif=0;cif<=dig;cif++) printf("%i",Grid[TGrid][TGrid][cif]);
    scanf("%i");
    return 0;
}

Poniendo en el tamaño de grid 20, la solución es inmediata.
Aquí las soluciones para los 50 primeros casos de mallados:


      1 -00000000000000000000000000000000000000002
      2 -00000000000000000000000000000000000000006
      3 -00000000000000000000000000000000000000020
      4 -00000000000000000000000000000000000000070
      5 -00000000000000000000000000000000000000252
      6 -00000000000000000000000000000000000000924
      7 -00000000000000000000000000000000000003432
      8 -00000000000000000000000000000000000012870
      9 -00000000000000000000000000000000000048620
     10 -00000000000000000000000000000000000184756
     11 -00000000000000000000000000000000000705432
     12 -00000000000000000000000000000000002704156
     13 -00000000000000000000000000000000010400600
     14 -00000000000000000000000000000000040116600
     15 -00000000000000000000000000000000155117520
     16 -00000000000000000000000000000000601080390
     17 -00000000000000000000000000000002333606220
     18 -00000000000000000000000000000009075135300
     19 -00000000000000000000000000000035345263800
     20 -00000000000000000000000000000137846528820
     21 -00000000000000000000000000000538257874440
     22 -00000000000000000000000000002104098963720
     23 -00000000000000000000000000008233430727600
     24 -00000000000000000000000000032247603683100
     25 -00000000000000000000000000126410606437752
     26 -00000000000000000000000000495918532948104
     27 -00000000000000000000000001946939425648112
     28 -00000000000000000000000007648690600760440
     29 -00000000000000000000000030067266499541040
     30 -00000000000000000000000118264581564861424
     31 -00000000000000000000000465428353255261088
     32 -00000000000000000000001832624140942590534
     33 -00000000000000000000007219428434016265740
     34 -00000000000000000000028453041475240576740
     35 -00000000000000000000112186277816662845432
     36 -00000000000000000000442512540276836779204
     37 -00000000000000000001746130564335626209832
     38 -00000000000000000006892620648693261354600
     39 -00000000000000000027217014869199032015600
     40 -00000000000000000107507208733336176461620
     41 -00000000000000000424784580848791721628840
     42 -00000000000000001678910486211891090247320
     43 -00000000000000006637553085023755473070800
     44 -00000000000000026248505381684851188961800
     45 -00000000000000103827421287553411369671120
     46 -00000000000000410795449442059149332177040
     47 -00000000000001625701140345170250548615520
     48 -00000000000006435067013866298908421603100
     49 -00000000000025477612258980856902730428600
     50 -00000000000100891344545564193334812497256




Un saludo.

No hay comentarios:

Publicar un comentario