Sudoku: règles de remplissage

altozinzin Messages postés 54 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 6 mai 2011 - 17 mars 2007 à 19:49
najma0202 Messages postés 10 Date d'inscription mardi 16 octobre 2007 Statut Membre Dernière intervention 23 décembre 2007 - 1 nov. 2007 à 23:27
Bonjour à tous. Tout d'abord je tiens à préciser que j'ai regarder les sources des sudoku présents, mais ils sont au-dessus de mon niveau (ba oui, je suis un débutant autodidacte, c'est pas facile, lol).
Voila mon soucis: je veux générer une grille pleine 9*9 de sudoku. J'arrive à respecter les règles des colonnes et des lignes ( je met moins de 5 sec à la générer en moyenne) mais je ne parviens pas à trouver un algo pour la règle des grilles 3*3. J'ai bidouillé quelques trucs mais dans ce cas au bout de 2h toujours pas la moindre grille de générer (je me met à la place du gars qui veut se faire un sudoku rapidos, s'il doit attendre 10h sa grille, ...).

Voila mes lignes de commandes, vous allez surement trouver ça trés brouillons, mal organisé, voire trop compliqué mais bon, ayez pitié, lol.

Private Sub Command1_Click()
Label10 = 0
Label12 = 0
Timer1.Enabled = True
Randomize Timer

inrecominche:
sortie = 0
' Création du tableau
Dim tableau(8, 8)
For a = 0 To 8
For b = 0 To 8
tableau(a, b) = "-"
Next b
Next a
'On commence le remplissage
Dim nbr1 As Integer
Dim nbr2 As Integer
For z = 1 To 9
For a = 1 To 9
debut:
DoEvents
nbr1 = Rnd * 8
nbr2 = Rnd * 8
'On regarde si la case est vide
If tableau(nbr1, nbr2) = "-" Then GoTo Suite1
GoTo debut
Suite1:
'On vérifie les règles colonnes et lignes du Sudoku
For b = nbr1 - -1 To 8

If tableau(b, nbr2) = z Then
' La petite commande sortie c'est juste pour pas que prog tourne à l'inifini alors qu'il n'y a pas de solution
sortie = sortie - -1
If sortie = 81 Then
GoTo inrecominche
End If
GoTo debut
End If

Next b
For b = 0 To nbr1 - 1
If tableau(b, nbr2) = z Then GoTo debut
Next b
For b = nbr2 - -1 To 8
If tableau(nbr1, b) = z Then GoTo debut
Next b
For b = 0 To nbr2 - 1
If tableau(nbr1, b) = z Then GoTo debut
Next b
tableau(nbr1, nbr2) = z
sortie = 0
Next a
Next z

'Si tout est OK, on rempli les labels
b = 0
c = 0
For a = 0 To 80
Label1(a) = tableau(b, c)
c = c - -1
If c = 9 Then
    c = 0
    b = b - -1
End If
Next a
Timer1.Enabled = False
End Sub

Au fait pour les commandes du style b = b - - 1, je ne met pas b= b +1 parce que sinon au lieu d'ajouter 1 a la valeur précédente, ça me rajoute le chiffre 1 à la fin du nombre et ça me fait 1111111 au lieu de 7, mais je sais pas pourquoi.
Merci d'avance.

3 réponses

jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
17 mars 2007 à 20:42
il suffirait sans doute de dire que b est un integer, pour éviter certains désagréments ....
0
damienpasqualinotto Messages postés 16 Date d'inscription samedi 4 mars 2006 Statut Membre Dernière intervention 1 décembre 2007
8 juil. 2007 à 22:48
Salut, c'est peut être trop tard mais pour ton probleme de la régle des grilles de 3x3 je pense qu'il vaut mieu que tu utilise un tableau de (2*2*2*2) plutot que de (8*8). C'est surment plus compliqué pour les coordonée des case mais au moins tu poura en plus des lignes et des colones gérer les grandes cases dans ta vérification des régles
0
najma0202 Messages postés 10 Date d'inscription mardi 16 octobre 2007 Statut Membre Dernière intervention 23 décembre 2007
1 nov. 2007 à 23:27
slt j veut un algo ki me donne ke la solution de sudoku est vrai ou nn vite plz
0
Rejoignez-nous