Bon j'ai aussi essayé de faire un résolveur en basic, et il met aussi beaucoup de temps !
Pollux> Le mien met de 1 minute à 3 minutes pour résoudre un sudoku de niveau facile à moyen, as-tu testé le tien sur un difficile ? En tout cas le mien ne marche pas
Pour ceux que ca intéresse, mon programme est disponible sur
http://j.petitjean.club.fr/bobti89/download/sudoku.zip
Et voilà un bon lien pour une approche de résolution
ici
Sinon, voilà en détail ce que je fais :
Le programme en lui-même :
solvdoku(m)
Prgm
Local nb,nb1
m2ms(m)»m
nbcaser(m)»nb
ClrIO
0»nb1
While nbnb1
nb»nb1
Disp nb
rempm(m)»m
seq(seq(when(dim(m[i,j])>1,"",m[i,j]),j,1,9),i,1,9)»m
nbcaser(m)»nb
EndWhile
ms2m(m)»res
Pause "Terminé !"
DispHome
EndPrgm
La matrice résolue est retournée dans la variable res.
Les fontions :
m2ms(m)
Func
seq(seq(when(m[i,j]=0,"",string(m[i,j])),j,1,9),i,1,9)
EndFunc
ms2m(m)
Func
seq(seq(when(m[i,j]="",0,expr(m[i,j])),j,1,9),i,1,9)
EndFunc
nbcaser(m)
Func
Local l
matÐlist(m)»l
sum(seq(when(l[i]="",1,0),i,1,81))
EndFunc
nbposs(str)
Func
Local s,i
""»s
For i,1,9
If inString(str,string(i))=0
s&string(i)»s
EndFor
s
EndFunc
rempm(m)
Func
Local m1,m2
m™»m1
seq(matÐlist(subMat(m,int((i-1)/3)*3+1,mod(i-1,3)*3+1,int((i-1)/3)*3+3,mod(i-1,3)*3+3)),i,1,9)»m2
seq(seq(when(m[i,j]="",nbposs(string(augment(augment(m[i],m1[j]),m2[int((j-1)/3)+1+int((i-1)/3)*3]))),m[i,j]),j,1,9),i,1,9)
EndFunc
Et deux matrices de test, la première est une facile, la deuxième un moyen :
0,9,0,0,7,0,0,1,5
0,0,1,0,3,5,6,0,0
5,0,7,4,0,2,0,3,0
0,5,0,0,8,0,0,0,6
7,0,0,1,0,0,3,8,9
3,0,0,0,2,6,1,0,0
0,7,8,0,0,3,0,4,0
0,0,5,0,4,0,2,0,7
4,0,2,0,6,0,8,9,0
0,0,8,3,7,0,5,0,0
1,5,0,0,8,9,0,0,0
9,0,7,5,0,0,0,0,1
0,0,0,0,0,4,0,2,0
0,2,0,6,9,0,0,0,4
8,0,0,0,2,3,0,0,0
3,0,1,0,4,0,9,5,0
0,0,0,0,0,6,0,0,7
5,0,2,0,0,7,1,4,0
Tout ça est dans le pack dont j'ai donné le lien au début !
Voilà, c'est surement pas ce qu'il y a de mieux, mais c'est un début
Si vous avez des remarques sur ma façon de m'y prendre, je les attends