Ya lo he leído pero sigo sin entender una cosa: te voy a poner el ejemplo del backtracking de cuando n=0:
void Backtracking(Matriz *M, int n , int *cantSol, int S, FILE *f)
{
int k;
if ( esValido(M, n, S)==1 )
{
if( esSolucion(M,n,S)==1 )
{
//imprimir(M, f);//
(*cantSol)++;
} else if(n<16)
{
for(k=0; k<10; k++)
{
M->tupla[n] = k;
actualizar(M, n);
Backtracking(M, n+1, cantSol, S, f);
desactualizar(M, n);
M->tupla[0] = n;
}
}
}
}
Cuando n=0,como en la función esValido() tenemos n-- sería n=-1, luego devolvería return 1.Vemos que se cumple la función esValido() y pasamos al if( esSolucion(M,n,S)==1 ). Como n=0, se tiene que n es distinto de 16 luego devuelve return 0 y no se cumple el if por tanto nos vamos al else if(n<16). Ahora (M->tupla[0] = 0) lo que nos hace es que le da el valor 0 a tupla[0]. Después (actualizar(M, 0) ) lo que hace es que le suma 0 a sumaDiag1, sumasFila y sumasColumna(es decir, que sigue siendo sumaDiag1=0, sumasFila=0 y sumasColumna=0). Después volvemos a empezar de nuevo el Backtracking(M, 0+1, cantSol, S, f) pero ahora con n=1 en vez de con n=0.
¿Y ahora lo que hace es que desactualiza lo que hemos hecho antes con n=0 o con n=1?¿Y nos vuelve a dar el valor 0 a tupla[0] o a tupla[1]?
Es que tengo esta duda porque como (desactualizar(M, n)) y (M->tupla[n] = 0) están después del Backtracking(M, 0+1, cantSol,S,f) nose si la n se refiere ahora a n=1 o a n=0.
Y otra duda: ¿el for cuándo pasa a k=1,k=2...,k=9?.
Gracias por estar ayudándome Pablo.