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