begin process at 2008 07 19 08:50:05
1 212 721 membres
60 nouveaux aujourd'hui
14 165 membres club

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 !

TOUS LES SUDOKU DU MONDE


Information sur la source

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é: 7 023 / 956

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

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


Description

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 !
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

14 avril 2008 16:34:44 :
Correction de mini-problèmes graphiques
  • signaler à un administrateur
    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).

  • signaler à un administrateur
    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.

  • signaler à un administrateur
    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.

  • signaler à un administrateur
    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é !

  • signaler à un administrateur
    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.

  • signaler à un administrateur
    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 !

  • signaler à un administrateur
    Commentaire de ghuysmans99 le 28/04/2008 21:38:11 10/10

    Bien !

Ajouter un commentaire

Pub



Appels d'offres

Dessins techniques
Budget : 60€
Animation Flash - Doma...
Budget : 370€
Application flash medi...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS