Un solveur de Sudoku en Javascript

J’ai bricolé vite fait un solveur de Sudoku sur le trajet de mes vacances à Berlin : http://pierre.fritsch.free.fr/sudoku

Il est programmé exclusivement en JavaScript.

Pour résoudre, l’algorithme maintient la liste des valeurs possibles pour chaque case, et fait 4 choses en cas de changement :

  • Elimination des impossibles ;
  • Recherche des absents ;
  • Elimination des doublettes ;
  • Elimination des triplettes.

Elimination des impossibles

Chaque fois qu’une case est résolue, la valeur correspondante est supprimée dans les autres cases sur la même ligne, la même colonne, et le même carré.

Recherche des absents

Lorsqu’un groupe (ligne, colonne, ou carré) ne contient qu’une seule case susceptible d’accueillir une valeur, alors cette valeur est assignée à la case en question.

Elimination des doublettes

Lorsque, dans un groupe, 2 cases ont chacune seulement 2 valeurs possibles, et si ces valeurs sont identiques, alors ces 2 valeurs sont forcément présentes dans ces 2 cases, et nulle part ailleurs dans le groupe.

Exemple :

-------------------------------------------------------
| 57  | 657 |  1  |  8  |  9  |  4  |  3  | 62  |  62 |
-------------------------------------------------------

Les valeurs 2 et 6 seront nécessairement présentes dans les deux dernières cases, ainsi on peut les éliminer dans la première case :

-------------------------------------------------------
| 57  |  57 |  1  |  8  |  9  |  4  |  3  | 62  |  62 |
-------------------------------------------------------

Elimination des triplettes

Même principe lorsque 3 valeurs apparaissent dans 3 cases.

Exemple :

-------------------------------------------------------
|  1  |  6  | 78  |  5  |  9  | 238 | 23  | 238 |  4  |
-------------------------------------------------------

Les valeurs 2, 3, et 8 apparaîtront forcément dans les sixième, septième, et huitième cases de ce groupe. Ainsi, on peut les éliminer partout ailleurs, ce qui résout la troisième case :

-------------------------------------------------------
|  1  |  6  |  7  |  5  |  9  | 238 | 23  | 238 |  4  |
-------------------------------------------------------