Mon solveur de s.u.d.o.k.u marche mais trouve pas toutes les solutions - C - Programmation
Marsh Posté le 09-06-2007 à 22:13:31
tata_monique a écrit : Bonjour à tous, Donc voilà, j'ai terminé de coder mon solveur de sudoku. Le principe du programme : Il est basé sur le principe de backtracking à partir d'une liste de candidats. En gros, au début du programme, il remplit pour chaque case d'un tableau 9x9 (la grille de sudoku) une liste chainée représentant chaque "candidat" d'une case, càd chaque nombre possible pour cette case. L'algorithme de backtracking en lui même est un algo récursif qui remplit la première case avec le premier candidat de cette case, puis passe à la case à remplir suivante et est rappelé lui même sur cette case. Il va donc essayer toutes les possibilités pour toutes les cases et est censé trouver toutes les solutions possibles d'une grille donnée. Le problème : Seulement mon programme trouve toujours (sur plusieurs grilles testées) au moins une solution, mais jamais l'ensemble des solutions de la grille traitée. J'ai pour exemple 3 grilles possédant respectivement 1, 18 et 9474 solutions (toutes 3 composées des mêmes chiffres, avec quelques-uns enlevés pour les grilles à 18 et 9474 solutions). Lorsque je traite la première grille, pas de problème, il trouve l'unique solution. Ayant déjà testé mon programme dans tous les sens et étant à court d'idées, j'aimerais savoir si vous aviez des propositions sur l'origine du problème. |
salut tata_monique,
je pense que ton problème peut avoir des origines diverses et variées, relatives au comptage du nombre de solutions jusqu'à l'algo lui même .... Peux tu poster le code ? Ou le plus important si c'est long
Marsh Posté le 09-06-2007 à 22:28:03
Ce programme représente un de mes projets de fin d'année donc je vais éviter de poster l'intégralité.
Néanmoins voilà les deux fonctions principales, en priant pour que mes "collègues" soient ne tombent pas dessus.
Code :
|
Les variables globales nbcc et nbsol désignent respectivement le Nombre de Cases Coloriées (donc si == 81 la grille est finie) et le Nombre de Solutions.
Grille est un tableau d'entiers de 9x9
Candidats est un tableau de pointeur de 9x9 dont chaque pointeur pointe vers une liste chainée des candidats de la case concernée.
Marsh Posté le 09-06-2007 à 22:41:32
Ce que je te dis ne corrigera pas ton pr blème mais te permettra de gagner un peu de temps :
Tu peux remplacer
Code :
|
par
Code :
|
Marsh Posté le 10-06-2007 à 01:23:26
humpf je suis pas sûr de tout comprendre car je ne connais pas l'algo et je ne vois pas ou sont déclarées (en global ?) les tableaus Candidats et Grille....
Un truc que je ne comprend pas, j'espère que je ne dis pas de conneries , dans la fonction Colorier() :
tu fais un test avec :
Code :
|
Ce qui à mon sens voudrait dire que Candidant est un tableau de pointeurs, dans le style de
Code :
|
Or, plus loin tu fais un test sur une valeur :
Code :
|
Sinon pour le printf si tu es sous linux tu peux utiliser la redirection standard ">", c'est plus simple que de créer un fichier avec un fopen(), etc...
Marsh Posté le 11-06-2007 à 08:01:47
Tu le fermes correctement ton fichier de sortie? Ca me fait penser a un probleme de flush ton truc.
Marsh Posté le 11-06-2007 à 09:25:44
On peut savoir pourquoi tu as effacé ton précédent topic ?
Marsh Posté le 09-06-2007 à 21:48:07
Bonjour à tous,
Donc voilà, j'ai terminé de coder mon solveur de sudoku.
Le principe du programme :
Il est basé sur le principe de backtracking à partir d'une liste de candidats.
En gros, au début du programme, il remplit pour chaque case d'un tableau 9x9 (la grille de sudoku) une liste chainée représentant chaque "candidat" d'une case, càd chaque nombre possible pour cette case.
L'algorithme de backtracking en lui même est un algo récursif qui remplit la première case avec le premier candidat de cette case, puis passe à la case à remplir suivante et est rappelé lui même sur cette case.
Il va donc essayer toutes les possibilités pour toutes les cases et est censé trouver toutes les solutions possibles d'une grille donnée.
Le problème :
Seulement mon programme trouve toujours (sur plusieurs grilles testées) au moins une solution, mais jamais l'ensemble des solutions de la grille traitée.
J'ai pour exemple 3 grilles possédant respectivement 1, 18 et 9474 solutions (toutes 3 composées des mêmes chiffres, avec quelques-uns enlevés pour les grilles à 18 et 9474 solutions).
Lorsque je traite la première grille, pas de problème, il trouve l'unique solution.
Pour la deuxième, il m'en trouve également une seule.
Et pour la dernière il m'en trouve 3800 et des poussières.
Ayant déjà testé mon programme dans tous les sens et étant à court d'idées, j'aimerais savoir si vous aviez des propositions sur l'origine du problème.
Message édité par tata_monique le 09-06-2007 à 22:28:49