begin process at 2012 05 27 20:36:45
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths

 > TOUS LES SUDOKU DU MONDE

TOUS LES SUDOKU DU MONDE


 Information sur la source

Note :
10 / 10 - par 2 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths Classé sous :récursivité, sudoku, solutions, diabolique, recursivite Niveau :Initié Date de création :09/04/2008 Date de mise à jour :14/04/2008 16:34:44 Vu / téléchargé :15 315 / 1 326

Auteur : neamar

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (18)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
Ce code illustre une nouvelle fois la récursivité.
Il se charge de calculer tous les sudoku possibles selon ce que vous lui donnez en entrée.
Si vous ne lui donnez rien, il se "contentera" de vous sortir toutes les grilles de sudoku existantes (oui oui, les 6'670'903'752'021'072'936'960. grilles possibles ! enfin, soyons franc, votre PC risque fortement d'être à court de mémoire avant que vous n'en voyez la couleur !).
Le tout tient en moins de 80 lignes de code... vive la récursivité (la source est abondamment détaillée).
En moyenne, il lui faut 0.2 secondes pour résoudre une grille diabolique...
Je l'ai laissé tourner pendant une heure et demie sur mon PC, j'ai recu 2 000 000 de solutions...ce qui prend 1.52 Go (il y a une option pour enregistrer les solutions dans un fichier).

Bonne lecture du code !

Source

  • Private Sub Solver(Grille_A_Solver() As Long)
  • 'Fonction récursive principale : elle prend en paramètre une grille et cherche à la remplir.
  • 'L'idée de base est d eprocéder par petits pas :
  • 'Cette fonction cherche UN emplacement vide.
  • 'Si elle n'en trouve pas, la grille passé en paramètre est déjà complète : parfaite.
  • 'Si elle en trouve un, elle essaie successivement d'y placer les nombres de 1 à 9. Si elle peut placer par exemple un 1, elle s'auto appelle alors avec une grille un peu moins vide.
  • 'De proche en proche, on obtien finalement une grille parfaitement remplie..et seules les combinaisons qui ont une probabilité d'être vraies sont testées.
  • 'Pour un très bon tutorial sur la récursivité : (sous formes d'algorithmes)
  • 'http://www.siteduzero.com/tuto-3-23774-1-la-recursivite.html
  • Dim i As Long, j As Long, k As Long, Case_Etait_Vide As Boolean
  • 'Si on a une solution et que l'on en a demandé une seule, c'est terminé !
  • If Termine And Not (AfficherToutesSoluces) Then Exit Sub
  • NBIterations = NBIterations + 1
  • 'i,j => parcourent le tableau
  • 'k parcourt les nombres de 1 à 9
  • 'Case_Etait_Vide indique si on a effectué une opération sur le tableau
  • Case_Etait_Vide = False
  • For i = 1 To 9
  • For j = 1 To 9
  • If Grille_A_Solver(i, j) = 0 Then
  • 'C'est une case vide, on va tenter de la remplir
  • For k = 1 To 9
  • If Try_To_Add(Grille_A_Solver, k, i, j) Then 'Si on a le droit d eplace k à l'emplacement i,j
  • 'Remplir la grille avec ce nombre, et la passer en paramètre à Grille_A_Solver.
  • Grille_A_Solver(i, j) = k
  • Solver Grille_A_Solver()
  • 'Puis la remettre à zéro pour la suite.
  • Grille_A_Solver(i, j) = 0
  • End If
  • Next
  • Case_Etait_Vide = True: Exit For
  • End If
  • Next
  • If Case_Etait_Vide Then Exit For
  • Next
  • 'Si on a jamais trouvé de case vide, c'est fini !
  • If Case_Etait_Vide = False Then
  • NBSolutions = NBSolutions + 1
  • AfficherSolution "TERMINE !!!! (Delta T = " & Int((Timer - Debut) * 100) / 100 & "s - Solution n°" & NBSolutions & ", cas traités : " & NBIterations & ")", Grille_A_Solver
  • Termine = True
  • DoEvents
  • End If
  • 'Debug.Print NBIterations
  • End Sub
Private Sub Solver(Grille_A_Solver() As Long)
    'Fonction récursive principale : elle prend en paramètre une grille et cherche à la remplir.
    'L'idée de base est d eprocéder par petits pas :
    'Cette fonction cherche UN emplacement vide.
    'Si elle n'en trouve pas, la grille passé en paramètre est déjà complète : parfaite.
    'Si elle en trouve un, elle essaie successivement d'y placer les nombres de 1 à 9. Si elle peut placer par exemple un 1, elle s'auto appelle alors avec une grille un peu moins vide.
    'De proche en proche, on obtien finalement une grille parfaitement remplie..et seules les combinaisons qui ont une probabilité d'être vraies sont testées.
    
    'Pour un très bon tutorial sur la récursivité : (sous formes d'algorithmes)
    'http://www.siteduzero.com/tuto-3-23774-1-la-recursivite.html
    
    
    Dim i As Long, j As Long, k As Long, Case_Etait_Vide As Boolean
    
    'Si on a une solution et que l'on en a demandé une seule, c'est terminé !
    If Termine And Not (AfficherToutesSoluces) Then Exit Sub
    NBIterations = NBIterations + 1
    
    'i,j => parcourent le tableau
    'k parcourt les nombres de 1 à 9
    'Case_Etait_Vide indique si on a effectué une opération sur le tableau
    Case_Etait_Vide = False
    For i = 1 To 9
        For j = 1 To 9
            If Grille_A_Solver(i, j) = 0 Then
                'C'est une case vide, on va tenter de la remplir
                For k = 1 To 9
                    If Try_To_Add(Grille_A_Solver, k, i, j) Then 'Si on a le droit d eplace k à l'emplacement i,j
                        'Remplir la grille avec ce nombre, et la passer en paramètre à Grille_A_Solver.
                        Grille_A_Solver(i, j) = k
                        Solver Grille_A_Solver()
                        'Puis la remettre à zéro pour la suite.
                        Grille_A_Solver(i, j) = 0
                    End If
                Next
                Case_Etait_Vide = True: Exit For
            End If
        Next
        If Case_Etait_Vide Then Exit For
    Next
    
    'Si on a jamais trouvé de case vide, c'est fini !
    If Case_Etait_Vide = False Then
        NBSolutions = NBSolutions + 1
        AfficherSolution "TERMINE !!!! (Delta T = " & Int((Timer - Debut) * 100) / 100 & "s - Solution n°" & NBSolutions & ", cas traités : " & NBIterations & ")", Grille_A_Solver
        Termine = True
        DoEvents
    End If
    'Debug.Print NBIterations
    
End Sub

 Conclusion

Just enjoy it !

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

14 avril 2008 16:34:44 :
Correction de mini-problèmes graphiques

 Sources du même auteur

Source avec Zip Source avec une capture UNE VRAIE CALCULATRICE : ÉCRITURE 2D : ON MARQUE LA LIGNE EN...

 Sources de la même categorie

Source avec Zip Source .NET (Dotnet) PERMUTATIONS DE CARACTÈRES par alpha5
Source avec Zip Source avec une capture PARTICIPATION À L'APPRENTISSAGE DE LECTURE DE L'HEURE (PENDU... par oulipan
Source avec Zip Source avec une capture TECHNIQUE TRADITIONNELLE DE LA DIVISION par oulipan
Source avec Zip Source avec une capture ENTRAÎNEMENT POUR EFFECTUER DES MULTIPLICATIONS EN COLONNES ... par oulipan
Source avec Zip Source avec une capture CONVERTISSEUR HEXAVIGÉSIMAL par shaeks

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Source .NET (Dotnet) RÉSOLUTION SUDOKU FACILITÉE par laurentdeh
Source avec Zip Source avec une capture SUDOKU SOLVEUR CRIBLE par ccgousset
Source avec Zip Source .NET (Dotnet) FOLDERS ET DOCUMENTS OUTLOOK SOUS FORME DE TREEVIEW ... RECU... par jmn59170
Source avec Zip RÉCURSIVITÉ: PLACER HUIT REINES SUR UN ÉCHIQUIER par lucqum
Source avec Zip DEMINEUR par Frasstalaka

Commentaires et avis

Commentaire de VBforfun le 14/04/2008 11:15:50

Bonjour,
Je rencontre quelques problèmes sous Win XP SP2 version US :
Quand je minimise l'appli, un message d'erreur apparait lorsqu'on la rappelle (Erreur d'exécution '380': Valeur de propriété incorrecte).
D'autre part, lorsque je rentre un chiffre dans la dernière case en bas à droite (comme si le curseur voulait passer à la case suivante), cela provoque une erreur (Erreur d'exécution '340': L'élément du groupe de contrôle '81' n'existe pas).

Commentaire de neamar le 14/04/2008 11:54:55

Bonjour,
Il s'agit de bugs minimes qui peuvent être facilement corrigés dans le code source associé à la Form. (Form_Resize et Sudoku_Valeur_Change).
Cependant, je rappelle que le but de ce code n'est pas d'avoir une application parfaite graphiquement, mais plutôt de disposer d'un framework opérationnel (le module) pour pouvoir l'utiliser dans une application plus complète.
Merci quand même pour cette remarque, que je corrigerais dès que je serai de nouveau sous Windows.

Commentaire de Lapou le 14/04/2008 12:18:36

Bonjour,

Ce code à l'air GENIAL, cependant je ne suis pas développeur !!! :-)
En fait j'aimerais me servir de cette source pour m'aider à résoudre certains sudokus que je fait lol :-)
Serait-il possible d'avoir ce type de source avec un exécutable car je ne dipose pas de vb ?

Par avance merci.

Commentaire de neamar le 14/04/2008 12:57:02

Tu peux télecharger le fichier ZIP : il y a un fichier .ex_ : modifie son extension en .exe, et c'est terminé !

Commentaire de mimiZanzan le 14/04/2008 22:21:17

A propos de Sudoku, ne chargez surtout pas le SudoPlanet qui est mentionné en pub sous la rubrique de cette page
"TOUS LES SUDOKU DU MONDE", Jeu Sudoku 100% gratuit: il vous colle un logiciel SpywareSecure_trial_setup qui perturbe le PC et dont je ne sais comment me débarrasser.
Quelqu'un est-il au courant de la procédure à adopter?
La restauration du système est aussi neutralisée.
Merci d'avance.

Commentaire de VBforfun le 20/04/2008 11:15:15

Bonjour,
Suite à mon premier commentaire, je tenais à signaler que sous Win XP pro FR ça marche très bien. Bizarre que sous une version US il y ait un problème. Mais cela vient peut-être de la personnalisation de la version que j'ai (corporate grande société).
En tout cas merci pour cette appli complète bien sympa !

Commentaire de ghuysmans99 le 28/04/2008 21:38:11 10/10

Bien !

Commentaire de garnier54 le 30/09/2008 11:20:54

bonjour,

bravo pour ton programme qui est tres belle exenple de recurcuvité. j'ai simplement essayé de le passer en VB.net 2008 j'ai un message sur les tableau (le compilateur est plus stricte en vb.net concernant les tableaux). Pouvez vous n'aider en rendre ce programme compatible VB.net

Merci de votre aide

Commentaire de garnier54 le 30/09/2008 18:08:48

bonjour

en fait j'ai trouvé d'ou vient le probleme mais je ne sais pas comment le resoudre.
Le programme passe en parametre un tableau a 2 dimension mais la procedure n'accepte qu'un tableau  à 1 dimension et plante

Private Sub AfficherSolution(ByRef Texte As String, ByRef Grille_A_Afficher() As Integer)

pouvez vous m 'aider

merci

Commentaire de neamar le 30/09/2008 20:12:26

Tu peux essayer de passer le tableau en unse seule dimension :
Ainsi, soit ton tableau : Tab_2D(9,9)
Tu peux le tranformer en un seul : Tab_1D(81),
avec la relation suivante :
Tab2D(i,j)=Tab_1D(i*9+j)

J'espere m'être fait comprendre...n'hésite pas à en demander plus !

Commentaire de garnier54 le 30/09/2008 20:21:02



merci pour cette astuce, mais ca devait etre possible en vb.net car cela etait possible en vb6 !

merci

Commentaire de neamar le 30/09/2008 20:23:24

Et bien, j'avoue ne pas connaitre le VB.net...demande à notre ami commun google !

Commentaire de mimiZanzan le 01/10/2008 00:12:23

NEAMAR,
Au sujet de ta formule pour convertir le tableau, il faut sûrement l'écrire
  Tab2D(i,j)=Tab_1D(i*10+j)
car sinon, on a par ex Tab2D(0,9)=Tab_1D(9)
             et aussi  Tab2D(1,0)=Tab_1D(9)

N'est-ce pas?

Commentaire de neamar le 01/10/2008 13:28:38

Oups ! rien  ne sert de courir, il faut partir à point !
J'ai voulu aller trop vite...tu as bien évidemment raison.

Commentaire de garnier54 le 04/10/2008 08:10:23

bonjour,

le code de ce programme utilise pour la saisie un textboxarray qui pernet une saisie tres sympa (verification numerique, passage automatique a la zone suivante etc ..)
comment faire la meme chose en net ?

merci


Commentaire de garnier54 le 18/11/2008 16:30:26

bonjour

j'ai passé ce programme en vb.net 2008, comme cela on peut l utiliser avce une version gratuite de VB
si ca interesse qq un je le depose. encore bravo pour ton programme.

nicolas

Commentaire de Matmatmatt le 08/04/2009 22:48:55 10/10

Pour convertir en .NET, il suffit de remplacer "ByRef Grille_A_Afficher()", "ByRef Grille_A_Solver()" et "ByRef Grille()" par "ByRef Grille_A_Afficher(,)", "ByRef Grille_A_Solver(,)" et "ByRef Grille(,)" après conversion.

Sinon, très bonne source, très souple avec un temps d'exécution minimum, et bien commentée en plus : 10/10 !

PS : Neamar, j'ai terminé CCDS !

Commentaire de neamar le 12/04/2009 12:00:39

Merci MattMatt ! Et bien joué pour CCDS :p

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Transfert de Données [ par guilloo ] Salut, je travaille sur une appli qui doit pouvoir transmettre des données (mbd access) via Internet mais mes employeurs (je suis en stage) ne veulent Besoin d'aide!! Avez vous la solutions ?? [ par spliter ] Pouvez-vous m'aider, mon projet a un bog et je ne comprend pas pourquoi. J'ouvre un fichier .txt que j'ai créer et je le lis (au début je n'es rien de récursivité en vb [ par fouesoft ] salut,je cherche à programme la fonction factorielle en récursif ... comment faire pour la condition d'arrêt en vbfouesoft MSFLEXGRID EXCEL [ par KC62 ] Bonjour a tous ! en cette belle journée ensoleilléMa question est simple coment transferer le contenu dune MSflexgrid vers un fichier excel ! si vs av SOS media 9 + durée d'un media [ par KC62 ] bonjour a tous voila mon souci est media 9. je sais 'est de la folie de gérer sa mais bon, petit challenge perso...je voudrais savoir comment récupére EXCEL + VBA + MATRICE, besoin de lastuce du jour [ par KC62 ] slt a tous ! je developpe une appli pour un magasin de vetement. je cherche a simplifié la saisi des articles et de leur stock. ainsi en saisissant la Solutions d'une equations du 3ème degré. [ par lesdentsduweb ] Bonjour !!Y'a-t-il un solveur sur VB pour résoudre une équation du 3ème degré.C'est à dire à partir des coefficients a,b,c,d de l'équation ax3 + bx² + VB + excel + graphique [ par KC62 ] Salut a tous ! Je cherche a générer des graphique dans une form a partir d'un tableau ( celui-ci récupéré dun base SQL) Jusqu'au tableau sa c'est géré Do events ? kesako sa ? [ par KC62 ] Salut a tous ! Dans un but d'appronfondir clairement ma culture VB. je cherche qq'1 qui pourrait m'expliquer ce que le do Events fair exactement ? dan probleme avec une combobox [ par airfox ] bonjour, Je viens de commencer en VB et j'ai un probleme avec une combobox. explication : dans ma combobox j'ai un choix à faire entre plusieu


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,749 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales