Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

RÉSOLUTION ET CRÉATIONS DE SUDOKUS


Information sur la source

Catégorie :Divers Classé sous : sudoku, récursif Niveau : Débutant Date de création : 24/11/2005 Date de mise à jour : 19/01/2006 10:57:08 Vu / téléchargé: 16 603 / 3 776

Note :
8 / 10 - par 7 personnes
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (33)
Ajouter un commentaire et/ou une note

Description

Voilà une p'tite classe qui peut résoudre et générer une grille de Sudoku avec plusieurs niveaux de difficulté.
Pour ceux qui ne connaissent pas ce jeu:
Le Sudoku se compose d'une grille 9x9 divisée en 9 carrés 3x3.
Le but du jeu est de remplir toute la grille de façon à ce que chacun des chiffre de 1 à 9 se retrouve une et une seule fois dans chaque ligne, dans chaque colonne et dans chacun des 9 carrés 3x3.
Selon le niveau de difficulté, un certain nombres de chiffres sont déjà donnés, et c'est au joueur de compléter le reste.

Ici le programme nécessite que l'on remplisse un fichier avec une suite de 81 chiffres, en mettant des 0 à la place des case vides à compléter.
 

Conclusion

L'idée générale est la suivante:
J'utilise deux procédures de résolutions: "elimination" et "recherche de position unique".
L'"élimination" va parcourir toutes les cases non encore déterminées et pour chacune de ces cases, supprimer les valeurs qui ne peuvent plus y etre (tout simplement en supprimant les valeurs qui sont déjà présentes dans la ligne la colonne et le carré de la case considérée.)
La "recherche de position unique" va regarder s'il y a des chiffre qui n'ont plus qu'une seule possibilité de placement dans une ligne, une colonne ou un carré; et dans l'affirmative, elle y place cette valeur.

Le programme lance ces deux procédure tant qu'elle modifie le Sudoku et donc tant qu'elle avancent vers la solution.
Lorsque plus rien n'est modifié par ces procédure et que le Sudoku n'est pas encore résolu, on cherche la première case qui n'est pas encore déterminée, et on fait un test d'hypothèse sur celle-ci. et on tente de résoudre récursivement le nouveau problème (éventuellement impossible).
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

24 novembre 2005 14:31:50 :
désolé :s erreur de fichier quand j'ai fait mon zip...
21 décembre 2005 16:21:20 :
Possibilité de générer des Sudoku aléatoirs avec plusieurs niveaux de difficulté.
19 janvier 2006 10:57:09 :
Ajout d'un fichier main pour un exemple de programme utilisant la librairie sudoku.h

Commentaires et avis

signaler à un administrateur
Commentaire de ncoder le 24/11/2005 19:41:02

Vraiment pas mal du tout...

Programme bien réfléchi mais meme avec les commentaires il faut s'accrocher !

Good programmation à tous

signaler à un administrateur
Commentaire de le_duche le 25/11/2005 10:32:41

C'est clair qu'il y avait interet à le commenter celui-là !
Surtout que j'avais la flemme de surdéfinir l'opérateur [] afin d'avoir une forme matricielle...
je pourrais le faire dans les améliorations...
Mais pour l'instant je vais plutot me pencher sur le problème de générer des Sudoku aléatoirs avec une seule solution possible.
(j'ai dejà ma petite idée... ^_^)

signaler à un administrateur
Commentaire de supers03 le 25/11/2005 18:25:50

Salut Le_Duche
J'ai fait un programme similaire la semaine dernière. en fait pour créer la grille j'en construit une aléatoirement, puis je supprime une à une les cases et à chaque fois j'essai de re_remplir la grille. Ainsi je suis sur que ma grille finale est faisable sans devoir mettre des valeurs au pif en plein milieu (chose que je trouve completement bete dans un jeu de reflexion). Je suis conscient de la lourdeur de cette méthode mais de toute façon ça va tellement vite (moins d'une seconde) que ça ne dérange pas.

signaler à un administrateur
Commentaire de ncoder le 25/11/2005 19:09:55

Bonne idée LE_DUCHE de générer des Sudokus aléatoires !

signaler à un administrateur
Commentaire de juju_browser le 25/11/2005 20:36:42

ton site est vraiment bien
http://leduche.blog.jeuxvideo.com/
chapo!

tebrowser

signaler à un administrateur
Commentaire de Kirua le 25/11/2005 22:26:07

Bonjour, je trouve que c'est une excellente idée de faire un compromis entre "réflexion humaine" et récursion propre au pouvoir des ordinateurs. Je pense que tu peux en tirer un simple algorithme de "rating" des sudoku, donner leur niveau. Par exemple, tu peux attribuer un point de difficulté par case trouvée par la "position unique", et x² ou même x³ points pour une case trouvée en faisant x hypothèses, puisque c'est bcp plus dur de faire plusieurs hypothèses de suite sans s'y perdre.

signaler à un administrateur
Commentaire de le_duche le 26/11/2005 13:39:57

supers03, je crois que je vais reprendre ton idée pour généré un sudoku aléatoire!
J'ai déjà fait la fonction pour générée une grille complète, mais il me reste à déterminer les case que l'on offre au joueur comme indices.
J'ai essayé hier soir une méthode qui ne marche pas du tout:
while(j'ai plus d'une solution)
{
  ajouter une case au hasard en plus comme information
}

Et parfois il ne me reste que 5 ou 6 cases libres apres...

J'ai donc encore un peu de boulot la dessus :D

signaler à un administrateur
Commentaire de le_duche le 26/11/2005 20:46:39

Désolé, j'avais un peu la tête dans le *** quand j'ai écrit mon post ci-dessus, et il n'est pas très clair... ^-^

signaler à un administrateur
Commentaire de dautrey le 28/11/2005 08:57:41

Avec quel compilateur avez-vous compilé le cpp ?
quand j'essaye de compiler
Le mien c'est Bloodshed DEV-C++ Version 4
il est pas très polis !
il me balance les deux erreurs suivantes:
sudoku.cpp: In function `int main(int, char **)':
sudoku.cpp:416: implicit declaration of function `int system(...)'
Quel réglage je dois apporter pour que ça marche ?
Cordialement.
François DAUTREY

signaler à un administrateur
Commentaire de le_duche le 28/11/2005 14:30:08

si tu es sous linux, enlève le system("pause"); c'est une commande dos.
Si tu n'est pas sous linux, essaye en replacant cette ligne par:

int schtroumpf;
cin >> schtroumpf;

si ca ne marche toujours pas, je ne sais pas...

signaler à un administrateur
Commentaire de dautrey le 29/11/2005 04:51:38

Merci, ça marche, je suis sous windows xp ... j'ai rien compris.
Votre code est remarquable.
Bravo pour votre site. Très didactique !

signaler à un administrateur
Commentaire de le_duche le 29/11/2005 17:42:44

pas besion de me vouvoyer ^-^ je n'ai que 20 ans...

signaler à un administrateur
Commentaire de Fflaite le 02/01/2006 18:18:04

salut à tous!
j'ai télécharger ce programme qui ma foie et fort remarquable !!
seulement lorsque je le compile avec dev c++, le programme ne se lance pas et il est affiché :
[Linker error] undefined reference to `WinMain@16'
  ld returned 1 exit status
Que dois je configurer dans dev afin de lancer le programme ?
merci
Fflaite

signaler à un administrateur
Commentaire de le_duche le 05/01/2006 22:08:46

Il faut faire un projet, avec un fichier main et une fonction main dedans... ici ce n'est qu'un librairie, tout comme iostream par exemple...

signaler à un administrateur
Commentaire de lamarch le 16/01/2006 02:06:40

Ce n'est pas évident de savoir quoi mettre dans le main...

Si t'en as fait un , est ce que tu pourrais le mettre en téléchargement stp?

signaler à un administrateur
Commentaire de le_duche le 16/01/2006 11:34:16

ok j'en ferai un ce soir et je le posterai demain...
Mais par exemple, tu crée un objet sudoku, tu le génère au niveau voulu, et tu le fais afficher. Si tu sais utiliser les fonctions de l'imprimante, tu lui fait imprimmer. Tu tente de le résoudre, puis tu lui fait afficher la solution...

signaler à un administrateur
Commentaire de le_duche le 19/01/2006 10:59:30

Voilà ! c'est fait...

signaler à un administrateur
Commentaire de yserver le 15/02/2006 18:27:53

J'ai pas lu ton code, mais à la lecture de la déscription : une petite proposition pour améliorer la rapiditer du code et eviter de nombreuses hypothèses.

Tu peux rechercher dans chaque zonne des doublettes (x,y) (triplettes...) de candidats et ainsi supprimer ces candidats (x et y) des candidats potentiels des autres cases de la zone.
En plus claire si dans une zone n cases ont pour candidats : (1,2,..,n) alors ces candidats seront obligatoirement dans ces n cases et ne sont donc plus des candidats potentiels des autres cases de la zone

Dans le même esprit, tu peux rechercher les chaines disjointes. C'est à dire si n (x,y,...) candidats sont présents dans n cases, sans necessairement être présents dans dans chacunes des n cases. Alors c'est n candidats finiront donc forcéments dans ces n cases et ne sont plus des candidat potentiels pour les autres cases de la zone.
Pour être plus claire et avec 3 candidats. Supposons 3 cases :
x avec pour candidats (1, 5)
y avec pour candidats (1, 8)
z avec pour candidats (5, 8) ou z (1, 8) ou z(1, 5, 8)
Alors le groupe de candidats (1,5,8) sera forcement dans les case x, y et z et nul part ailleurs.

Juste une suggestion car je me suis beaucoup amusé à coder ça (ca fait des boucle...).

Bonne soiré

signaler à un administrateur
Commentaire de le_duche le 16/02/2006 14:36:35

J'ai étudié les math qui sont derrières, et ce que tu me propose est doffice trouvé par mes deux procédures sans devoir faire de supposition (à condition que le sudoku de départ contienne une seule solution) Cela vient du fait que si tu as un doublet quelque part, alors les autres cases qui ne sont pas dans le doublet seront forcément déterminées univoquement par le reste du tableau. D'autre part, comme le tableau ne doit posséder qu'une seule solution, trouver se doublet se fera indépendemment de ce qui reste dans la colonne, donc on y arrivera aussi...

++ merci du conseil q-meme :D

signaler à un administrateur
Commentaire de yserver le 16/02/2006 17:18:30

Je suis pas d'accord, pour plusieurs raison.
1- tu semble t'être arreté au doublette mais avec 3 4 .. ca marche et alors ton raisonnement semble ne pas prendre en compte toutes les données.
2- tu ne parle pas des chaines disjointes
2- en implementant en plus dans mon programme cette recherche de doublette triplette et chaine disjointe, je resolvais certain sudoku sans hypothese alors que avant ces fonctions non.
3- si j'ai ajouté toutes ces fonctions supplementaires c'est pour pouvoir résoudre des sudoku que si non je ne resolvais que par l'utilisation d'hypothèse que mon prog ne fait pas et que les résultats étaient probant.
4- un contre exemple cette adresse http://www.mots-croises.ch/Sudoku/grille.htm?t=N4 en sans la recherche des doublettes/tiplettes mon programme ne le resoud pas et avec si.

Cela dit c'est pas forcement plus performant de traiter tous c'est cas de figure le test est peut etre plus rapide. Mais je pense que la recherche de c'est deux type de figure doit grandement améliorer les performances (c'est de la pure intuition.)

Bonne soiré

signaler à un administrateur
Commentaire de le_duche le 16/02/2006 17:26:27

Je testerai ce sudoku sur mon programme (sais pas le faire ici), mais j'vais testé les Sudoku du Figaro et d'un journal Belge, et à chaque fois, il trouvais sans supposition.
Mais si ta grille me le fait faire avec une supposition, ca m'interesse meme beaucoup, pcq je ne sais donc pas si cette partie de mon code a un bug :p

++ Bonne Prog !

signaler à un administrateur
Commentaire de yserver le 16/02/2006 19:47:31

SI tu est interessé je peux t'envoyer un bout de mon code en vba avec excel.
J'ai fait ca fissa pour des collegues qui me gonflaient avec leur sudoku. Je dis ca car moi ca ne m'amuse pas bcp mais je me suis bcp amuser en faisant ce petit prog. En plus j'ai découvert ainsi un monde passionnant celui du sudoku.

bonne soiré.

signaler à un administrateur
Commentaire de Kirua le 17/02/2006 12:41:38

"J'ai étudié les math qui sont derrières", le contraire m'aurait étonné :). Mais tu as approfondis les maths de la résolution ou de la construction des grilles? De ce que j'ai pu voir sur les forums spécialisés, point de vue niveau d'abstraction, c'est franchement pas pareil :/ Bcp plus simple de résoudre que de créer (avec toute la rigueur associée; juste générer des grilles "qui marchent" c'est pas compliqué).

signaler à un administrateur
Commentaire de le_duche le 17/02/2006 13:36:20

Ben en fait j'ai fait une fonction qui résoud les grilles, et chaque fois qu'il doit faire une supposition, il choisit une valeur aléatoire parmis les chiffres encore possibles.
Donc en lui donnant une grille vide, il me génère une grille de Sudoku aléatoire...

signaler à un administrateur
Commentaire de le_duche le 17/02/2006 13:42:20

note pour Kirua: Tu sais peut-etre de quoi il s'agit, je présente le Sudoku (mon programme de résolution) au printemps des Sciences organisé par l'ULB, dont le thème est le cerveau (on bosse sur les juex de logique...)

signaler à un administrateur
Commentaire de Kirua le 17/02/2006 22:53:18

Je connais bien le printemps des sciences, j'y étais allé voir pas mal de choses, entre autre une présentation sur les algos génétiques faite par (entre autres) un coder de cppfrance aussi :).

C'est en mars toujours? Je tenterai d'y aller, c'est tjs sympa :) Et pourquoi pas avec quelqu'un que tu connais bien, comme la fois passée.

signaler à un administrateur
Commentaire de le_duche le 18/02/2006 13:13:13

Ok ben à bientot alors :D

signaler à un administrateur
Commentaire de Eagle4 le 03/04/2006 17:30:14

dis moi tu crois qu'il serait possible de générer les grilles aléatoires avec toutjours le meme niveau de difficulté ??? genre que chaque case vide en normal propose 2 ou 3 possibilité de chiffre environ (je dis environ car y a forcement une case à une solution ^^ sinon le sudoku n'aura pas qu'une solution...) mais c'est histoire d'homogénisé les générations...

signaler à un administrateur
Commentaire de le_duche le 05/04/2006 20:05:30

Pas avec ma méthode aléatoire en tous cas...

signaler à un administrateur
Commentaire de Eagle4 le 05/04/2006 20:20:39

arf c'est c** ca, j'arrive pas à trouver un bon générateur qui fais ca :(

signaler à un administrateur
Commentaire de le_duche le 05/04/2006 20:24:22

Ben fais le alors ^^

signaler à un administrateur
Commentaire de Eagle4 le 05/04/2006 20:28:56

oui mais là je dois bien avouer que ce niveau est trop élevé pour moi lol... nan sérieusement, c'était surtout pas pour te vexer, il est super bien foutu ton code ;) d'ailleur c'est parce que ton code est super bien fais que je te demandais à toi ^^
m'enfin bon je vais essayé de me débrouiller merci quand meme ;)

signaler à un administrateur
Commentaire de le_duche le 06/04/2006 13:56:09

Ce que tu peux toujours faire, c'est ajouter des critères de création dans le test, mais comme ma construction est aléatoire, il est possible que l'algo mette alors beaucoup de temps pour créer une grille valide...

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Utilisation de la fonction main en récursif [ par floriandevelop ] Bonjour! pour ma première question, je vais demander un truc qu'on pourra trouver tordu..! alors voilà: comment peut-on utiliser directemen Résolution du jeu sudoku [ par marik7335 ] Salut tout le monde,J'aimerais avoir quelques quelques pistes pour pouvoir résoudre le jeu du sudoku en C. J'ai du mal à établir l'algo SUDOKU [ par elmouflones ] bonjour a tous je cherche a faire un sudoku en c et jaimerais avoir un peu d'aide merci Solver un sudoku avec le dancing-steps de Donald Knuth [ par kenny76 ] Bonjour, je suis en train d'implémenter la méthode de D.Knuth utilisant les listes doublement chainées pour résoudre les probl&#23 Sudoku [ par MasterShadows ] Bonjour à tous et à toutes,alors voilà, je dois coder en C pour Linux un petit programme permettant de générer une grille de Besoin d'aide c'est urgent ! ( SUDOKU ) [ par Timbo2000 ] Bonjour tout le monde, j'orai besoin d'aide dans la réalisation d'un programme en pascal permettant de résoudre et générer une gri Sudoku en langage C [ par Bavimo ] Si cela peut aider, vous trouverez un source pour résoudre les grilles de sudoku à : http://www.i2i.fr/ Langage C. Méthode récursive. Mis à part la sa Sudoku en langage C [ par Bavimo ] Bonjour. Il y a quelques semaine j'avais signalé le site http://www.i2i.fr dans lequel je mettais à disposition un source en C qui résoud les grilles Projet d'été sur SUDOKU!! Aidez-nous s'il vous plait... [ par Naruttibayo ] Au préalable, nous tenons à remercier tous ceux qui contribuerons à notre projet...On nous demande d'écrire un programme C qui permet de Générer des G


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,234 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.