j'ai réalisé un petit script en js concernant la résolution d'une grille de sudoku avec une fonction récursive.
La résolution fonctionne mais j'ai tout de même un problème:
Pour comprendre voici l'essentiel du script
window.onload=function()
{
// Exemple
sudoku = '100006000050700003009020000040500300000090050000000074070800040600000800002001000';
document.getElementById("start").onclick = function()
{
// Initialisation du chrono
var d = new Date();
start_time = d.getTime();
show2(sudoku); // Affichage de la grille de départ
solve(sudoku); // Résolution de la grille
// Affichage du chrono
var d = new Date();
var secs = (d.getTime() - start_time)/1000;
document.getElementById("chrono").value = secs+'s';
}
}
et la fonction solve
function solve(su)
{
nb++; // Compteur
/* ISOLER LES VARIABLES */
var _sud = su, _nsud, _sudlen = _sud.length,
_sol = find_sol(_sud), _nsol,
_isud, _listsol, _ils;
if(_sol === false) return false; // Aucune solution
_isud = _sol[0], _listsol = _sol[2];
for(_ils in _listsol) // Parcours des solutions de la case
{
_nsud = _sud.substr(0, _isud)+_listsol[_ils]+_sud.substr(_isud+1, _sudlen);
//sudoku = _nsud; // Maj du sudoku global
document.getElementById("s"+_isud).value = _listsol[_ils];
var test = solve(_nsud);
if(nb_libre(_nsud) == 0 || test == true) // Le sudoku est complet
{
//show2(sudoku);
return true;
}
document.getElementById("s"+_isud).value = 0;
}
return false;
}
Normalement quand je click sur le bouton j'ai devrais voir la grille de départ et ensuite la résolution se lance mais la il effectue la résolution et après il affiche la grille de départ (si je n'affiche rien dans la fonction solve), incroyable ...
Et pour finir même si je lui demande de mettre à jour la grille pendant la résolution il fait tout mais une fois la résolution terminée.
la seul solution que j'ai trouvé c'est de mettre un setTimeout pour le premier problème
et de faire une alert dans la fonction solve (que je bloque par la suite avec le navigateur)
et la sa fonctionne mais en contrepartie le temps de résolution devient incroyablement long.