Sudoku Solver — Résolution par filtrage logique
Un solveur de Sudoku en Python utilisant une approche de filtrage par contraintes (propagation de contraintes) sur les lignes, colonnes et blocs 3×3, sans backtracking.
Description
Ce programme résout automatiquement des grilles de Sudoku en appliquant itérativement trois filtres logiques :
- Filtrage en ligne : supprime les candidats déjà présents sur la même ligne
- Filtrage en colonne : supprime les candidats déjà présents dans la même colonne
- Filtrage en bloc : supprime les candidats déjà présents dans le même bloc 3×3
À chaque itération, si une case ne possède plus qu'un seul candidat possible, sa valeur est fixée automatiquement. Le processus se répète jusqu'à résolution complète (ou stagnation pour les grilles nécessitant du backtracking).
🗂️ Structure du projet
Solveur_De_Sudoku_Naif/
├── sudoku.py # Script principal
├── LICENSE # LICENSE du programme
└── README.md # Ce fichier
Prérequis
- Python 3.7 ou supérieur
- Module
copy (inclus dans la bibliothèque standard Python)
Aucune dépendance externe n'est requise.
Utilisation
Lancer le solveur
python sudoku.py
Modifier la grille à résoudre
Dans sudoku.py, remplacez la grille facile par la vôtre. Les cases vides sont représentées par 0 :
facile = [
[0, 3, 8, 0, 9, 0, 0, 0, 0],
[9, 0, 0, 4, 0, 8, 6, 0, 2],
# ...
]
Puis assurez-vous que la variable sudoku pointe vers votre grille :
sudoku = deepcopy(facile)
Exemple de sortie
-------------------------
| 5 3 8 | 9 6 3 | 7 2 4 |
| 9 1 2 | 4 5 8 | 6 3 2 |
| ...
-------------------------
Fonctionnement détaillé
Structure de données
sudoku : grille 9×9 (liste de listes), les 0 représentent les cases vides.
possible : liste plate de 81 éléments, chaque élément est la liste des valeurs candidates pour la case correspondante.
La case à la ligne i et colonne j correspond à l'indice i*9 + j dans possible.
Algorithme
Pour chaque itération (1000 fois) :
1. filtre_en_ligne(i) pour i de 0 à 8
2. filtre_en_colonne(i) pour i de 0 à 8
3. filtre_en_bloc(i) pour i de 0 à 8
4. update() → fixe les cases à candidat unique
Fonctions principales
| Fonction | Rôle |
|---|
update() | Synchronise sudoku et possible, fixe les cases à valeur unique |
affichage(sudoku) | Affiche la grille formatée dans le terminal |
filtre_en_ligne(ligne) | Retire les candidats impossibles sur une ligne |
filtre_en_colonne(colonne) | Retire les candidats impossibles sur une colonne |
filtre_en_bloc(bloc) | Retire les candidats impossibles dans un bloc 3×3 |
nbr_zero(sudoku) | Compte les cases encore non résolues |
Limitations
- L'algorithme fonctionne uniquement pour les grilles résolubles par propagation de contraintes (grilles dites "faciles" à "moyennes").
- Les grilles difficiles nécessitant du backtracking (tentative/erreur) ne seront pas entièrement résolues par ce solveur.
- Les variables
sudoku et possible sont globales, ce qui limite la réutilisabilité directe du code sous forme de module.
Pistes d'amélioration
- Ajouter un algorithme de backtracking pour résoudre les grilles difficiles
- Refactoriser en programmation orientée objet pour encapsuler l'état
- Ajouter une interface graphique (Tkinter ou Pygame)
- Permettre la saisie interactive de la grille par l'utilisateur
- Implémenter un générateur de grilles aléatoires
Auteur
Créé par LE GULUDEC ARTHUR — Octobre 2025
Licence
Ce projet est distribué sous licence MIT. Voir le fichier LICENSE pour plus de détails.