IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Algorithme génération sudoku


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 54
    Par défaut Algorithme génération sudoku
    Bonjour à tous je cherche desespérement à faire un code qui génère un sudoku en VBA cependant après avoir essayer avec diverses méthode je n'y arrive pas.
    J'ai vu beaucoup de sujet là dessus mais aucun ne m'a REELLEMENT éclairé pourriez vous m'aider ?

    PS : je parle bien d'un algorithme et non d'un code j'ai juste besoin du concept de base pour progresser

    Merci à vous

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Est-ce que tu parles de créer une nouvelle grille de Sudoku ou de résoudre une grille donnée ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    En fait pour créer un sudoku valide il faut être capable de le résoudre par code.

    https://www.dewep.net/realisations/c...-en-javascript

  4. #4
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par dysorthographie Voir le message
    En fait pour créer un sudoku valide il faut être capable de le résoudre par code.
    Autre méthode (quand on est fainéant) : tu prends une grille valide, tu permutes des lignes dans les groupes de 3, tu permutes des groupes de 3 entre eux, tu fais la même chose avec les colonnes, tu fais une permutation aussi de chiffres et... abracadabra... tu as une grille qui ne ressemble plus du tout à sa grille mère mais qui est tout aussi valable.

    Avec cette méthode, une seul grille de Sudoku peut en générer des centaines de milliers.
    C'est une méthode qui est très connue des marchands de grilles et qui fait que ce jeu est beaucoup plus rentable que des mots fléchés.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 54
    Par défaut
    Je cherche bien à générer des grilles.

    D'accord mais même si on doit pouvoir en résoudre un, quel serait l'algorithme de la génération et de la résolution ?

    Merci

  6. #6
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par m.peres.97 Voir le message
    D'accord mais même si on doit pouvoir en résoudre un, quel serait l'algorithme de la génération et de la résolution ?
    Je ne vois que deux méthodes :

    Soit tu récupères une dizaine de grilles et tu utilises la méthode "fainéant" que je décris dans mon post précédent, ce qui te permettra d'en générer quelques millions (méthode simple et rapide qui te permet même d'assigner une difficulté).
    Edit : j'ai fait un rapide calcul : à partir d'une grille, on peut en fabriquer ainsi plus de 1000 milliards ( 3!^8 x 9! x 2).

    Soit tu génères des grilles aléatoires que tu testes avec un algorithme de résolution pour vérifier qu'il y a une (et une seule) solution.

    Mais trouver l'algorithme de création de grille est un problème qui n'a rien à voir avec VBA Excel.

    Pour ce qui est de la résolution, j'avais fait ça il y a quelques années :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    Sub SDK2()
     
       Y_TpsStart = Timer
     
       ' Consultation du tableau
     
       For Y_L = 1 To 9
          For Y_C = 1 To 9
             Y_Y = (Y_L - 1) * 9 + Y_C
             Y_YL(Y_Y) = Y_L
             Y_YC(Y_Y) = Y_C
     
             Select Case ActiveSheet.Cells(Y_L, Y_C).Value
             Case 1 To 9
                Y_Cur(Y_L, Y_C) = ActiveSheet.Cells(Y_L, Y_C).Value
                Y_Fix(Y_L, Y_C) = True
             Case Else
                Y_Cur(Y_L, Y_C) = 0
                Y_Fix(Y_L, Y_C) = False
             End Select
          Next Y_C
       Next Y_L
     
       ' recherche
     
       Y_Y = 1
       Do While Y_Y <= 81
          Y_L = Y_YL(Y_Y)
          Y_C = Y_YC(Y_Y)
     
          If Y_Fix(Y_L, Y_C) Then
             Y_Y = Y_Y + 1
          Else
             Y_Cur(Y_L, Y_C) = Y_Cur(Y_L, Y_C) + 1
     
             Do While Y_Cur(Y_L, Y_C) <= 9
                If SDK_Test() Then Exit Do
                Y_Cur(Y_L, Y_C) = Y_Cur(Y_L, Y_C) + 1
             Loop
     
             If Y_Cur(Y_L, Y_C) <= 9 Then   ' viable
                Y_Y = Y_Y + 1
             Else
                Y_Cur(Y_L, Y_C) = 0
                Do
                   Y_Y = Y_Y - 1
                   Y_L = Y_YL(Y_Y)
                   Y_C = Y_YC(Y_Y)
                Loop Until Not Y_Fix(Y_L, Y_C)
             End If
     
          End If
       Loop
     
       ' Affichage du résultat
     
       For Y_L = 1 To 9
          For Y_C = 1 To 9
             If Y_Fix(Y_L, Y_C) Then
                ActiveSheet.Cells(Y_L, Y_C).Font.Color = RGB(200, 0, 0)
             Else
                ActiveSheet.Cells(Y_L, Y_C).Value = Y_Cur(Y_L, Y_C)
                ActiveSheet.Cells(Y_L, Y_C).Font.Color = RGB(0, 0, 255)
             End If
          Next Y_C
       Next Y_L
     
       ActiveSheet.Cells(1, 13).Value = Y_TpsStart
       ActiveSheet.Cells(2, 13).Value = Timer
       ActiveSheet.Cells(3, 13).Value = Timer - Y_TpsStart
     
    End Sub
    Public Function SDK_Test() As Boolean
     
       SDK_Test = False
     
       ' RAZ
       For Y_I = 1 To 9
          Y_Test(Y_I, 1) = False
          Y_Test(Y_I, 2) = False
          Y_Test(Y_I, 3) = False
       Next Y_I
     
       ' Ligne et colonne
       For Y_I = 1 To 9
          Y_T = Y_Cur(Y_I, Y_C)
          If Y_T > 0 Then
             If Y_Test(Y_T, 1) Then Exit Function
             Y_Test(Y_T, 1) = True
          End If
     
          Y_T = Y_Cur(Y_L, Y_I)
          If Y_T > 0 Then
             If Y_Test(Y_T, 2) Then Exit Function
             Y_Test(Y_T, 2) = True
          End If
       Next Y_I
     
       ' en carré
       Y_I0 = Y_L - (Y_L - 1) Mod 3
       Y_J0 = Y_C - (Y_C - 1) Mod 3
       For Y_I = 0 To 2
          For Y_J = 0 To 2
             Y_T = Y_Cur(Y_I0 + Y_I, Y_J0 + Y_J)
             If Y_T > 0 Then
                If Y_Test(Y_T, 3) Then Exit Function
                Y_Test(Y_T, 3) = True
             End If
          Next Y_J
       Next Y_I
     
       SDK_Test = True
     
    End Function
    Je n'ai pas trouvé de grille classique qui résiste plus d'un dixième de seconde à ce code.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 54
    Par défaut
    Je vais regarder ça merci

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/02/2015, 15h05
  2. Algorithme génération chaine
    Par mat1554 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 09/02/2014, 00h09
  3. [IA] Creer un sudoku (algorithme pour le moment)
    Par haydens dans le forum Intelligence artificielle
    Réponses: 9
    Dernier message: 31/01/2008, 20h42
  4. Algorithme de génération de textures.
    Par Disciple195 dans le forum SDL
    Réponses: 2
    Dernier message: 18/06/2007, 20h16
  5. Tentative de génération d'un tableau type "sudoku"
    Par charlybapt dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 06/04/2006, 09h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo