OVH Cloud OVH Cloud

Solution Sudoku ?

4 réponses
Avatar
garnote
Bonjour, Bonjour,

Stie, je capote sur le Sudoku ;-)
Une question parmi tant d'autres :
Comment savoir si une grille remplie satisfait toutes
les conditions du Sudoku. Voici ma macro.
À votre avis, est-elle compétente pour répondre
à la question ? Peut-on procéder autrement ?

Marsu doku

Sarge


Option Base 1
Sub Sudoku()
B = Array("bloc1", "bloc2", "bloc3", "bloc4", "bloc5", "bloc6", "bloc7",
"bloc8", "bloc9")
For i = 1 To 9
For n = 1 To 9
t = WorksheetFunction.CountIf(Range("grille").Rows(i), n)
If t = 1 Then k = k + 1
Next n
Next i
For j = 1 To 9
For n = 1 To 9
t = WorksheetFunction.CountIf(Range("grille").Columns(j), n)
If t = 1 Then k = k + 1
Next n
Next j
For i = 1 To 9
For n = 1 To 9
t = WorksheetFunction.CountIf(Range(B(i)), n)
If t = 1 Then k = k + 1
Next n
Next i
If k = 243 Then MsgBox "OK" Else MsgBox "Pas OK"
End Sub

4 réponses

Avatar
SL
Bonjour Serge
1er test : somme(grille) = 405 sinon "pas OK"
ensuite plutôt que de vérifer que chaque chiffre est présent 1 fois sur
chaque ligne, colonne, région, il suffit peut-être vérifier seulement que la
somme de chaque ligne et chaque colonne fait 45 et que chaque chiffre est
présent 9 fois dans la grille (je ne suis même pas sûr qu'il faille vérifier
la somme sur les régions).

Stéphane

"garnote" a écrit dans le message de news:

Bonjour, Bonjour,

Stie, je capote sur le Sudoku ;-)
Une question parmi tant d'autres :
Comment savoir si une grille remplie satisfait toutes
les conditions du Sudoku. Voici ma macro.
À votre avis, est-elle compétente pour répondre
à la question ? Peut-on procéder autrement ?

Marsu doku

Sarge


Option Base 1
Sub Sudoku()
B = Array("bloc1", "bloc2", "bloc3", "bloc4", "bloc5", "bloc6",
"bloc7", "bloc8", "bloc9")
For i = 1 To 9
For n = 1 To 9
t = WorksheetFunction.CountIf(Range("grille").Rows(i), n)
If t = 1 Then k = k + 1
Next n
Next i
For j = 1 To 9
For n = 1 To 9
t = WorksheetFunction.CountIf(Range("grille").Columns(j), n)
If t = 1 Then k = k + 1
Next n
Next j
For i = 1 To 9
For n = 1 To 9
t = WorksheetFunction.CountIf(Range(B(i)), n)
If t = 1 Then k = k + 1
Next n
Next i
If k = 243 Then MsgBox "OK" Else MsgBox "Pas OK"
End Sub




Avatar
DanC
La somme de chaque région égale aussi 45, car chaque chiffre est unique dans
chaque région.
Ô sudoku quand tu nous tiens!
bonne journée!




--
(___) Danielle
(oo) "... A quoi bon la charrue
/------- et la voile, la terre et
|| || la vie sans la liberté?"
||---W|| * - Ralph Waldo Emerson
^^ ^^
"SL" a écrit dans le message de news:

Bonjour Serge
1er test : somme(grille) = 405 sinon "pas OK"
ensuite plutôt que de vérifer que chaque chiffre est présent 1 fois sur
chaque ligne, colonne, région, il suffit peut-être vérifier seulement que
la somme de chaque ligne et chaque colonne fait 45 et que chaque chiffre
est présent 9 fois dans la grille (je ne suis même pas sûr qu'il faille
vérifier la somme sur les régions).

Stéphane

"garnote" a écrit dans le message de news:

Bonjour, Bonjour,

Stie, je capote sur le Sudoku ;-)
Une question parmi tant d'autres :
Comment savoir si une grille remplie satisfait toutes
les conditions du Sudoku. Voici ma macro.
À votre avis, est-elle compétente pour répondre
à la question ? Peut-on procéder autrement ?

Marsu doku

Sarge


Option Base 1
Sub Sudoku()
B = Array("bloc1", "bloc2", "bloc3", "bloc4", "bloc5", "bloc6",
"bloc7", "bloc8", "bloc9")
For i = 1 To 9
For n = 1 To 9
t = WorksheetFunction.CountIf(Range("grille").Rows(i), n)
If t = 1 Then k = k + 1
Next n
Next i
For j = 1 To 9
For n = 1 To 9
t = WorksheetFunction.CountIf(Range("grille").Columns(j), n)
If t = 1 Then k = k + 1
Next n
Next j
For i = 1 To 9
For n = 1 To 9
t = WorksheetFunction.CountIf(Range(B(i)), n)
If t = 1 Then k = k + 1
Next n
Next i
If k = 243 Then MsgBox "OK" Else MsgBox "Pas OK"
End Sub








Avatar
SL
Exact, mais je me demandais simplement s'il était vraiment nécessaire de le
vérifier (ie si les conditions précédentes n'étaient pas suffisantes).
Ayant trouvé un contre-exemple (simple carré magique 3x3 reproduit 9 fois),
il faut en effet vérifier également que la somme de chaque région est bien
45.

Donc SOMME de chaque ligne, colonne, région = 45 et
SOMMEPROD((NB.SI(grille;LIGNE(1:9))=9)*1) = 9

Bonne journée également

Stéphane

"DanC" a écrit dans le message de news:

La somme de chaque région égale aussi 45, car chaque chiffre est unique
dans chaque région.
Ô sudoku quand tu nous tiens!
bonne journée!




--
(___) Danielle
(oo) "... A quoi bon la charrue
/------- et la voile, la terre et
|| || la vie sans la liberté?"
||---W|| * - Ralph Waldo Emerson
^^ ^^
"SL" a écrit dans le message de news:

Bonjour Serge
1er test : somme(grille) = 405 sinon "pas OK"
ensuite plutôt que de vérifer que chaque chiffre est présent 1 fois sur
chaque ligne, colonne, région, il suffit peut-être vérifier seulement que
la somme de chaque ligne et chaque colonne fait 45 et que chaque chiffre
est présent 9 fois dans la grille (je ne suis même pas sûr qu'il faille
vérifier la somme sur les régions).

Stéphane

"garnote" a écrit dans le message de news:

Bonjour, Bonjour,

Stie, je capote sur le Sudoku ;-)
Une question parmi tant d'autres :
Comment savoir si une grille remplie satisfait toutes
les conditions du Sudoku. Voici ma macro.
À votre avis, est-elle compétente pour répondre
à la question ? Peut-on procéder autrement ?

Marsu doku

Sarge


Option Base 1
Sub Sudoku()
B = Array("bloc1", "bloc2", "bloc3", "bloc4", "bloc5", "bloc6",
"bloc7", "bloc8", "bloc9")
For i = 1 To 9
For n = 1 To 9
t = WorksheetFunction.CountIf(Range("grille").Rows(i), n)
If t = 1 Then k = k + 1
Next n
Next i
For j = 1 To 9
For n = 1 To 9
t = WorksheetFunction.CountIf(Range("grille").Columns(j), n)
If t = 1 Then k = k + 1
Next n
Next j
For i = 1 To 9
For n = 1 To 9
t = WorksheetFunction.CountIf(Range(B(i)), n)
If t = 1 Then k = k + 1
Next n
Next i
If k = 243 Then MsgBox "OK" Else MsgBox "Pas OK"
End Sub












Avatar
SL
Re-bonjour
Donc SOMME de chaque ligne, colonne, région = 45 et
SOMMEPROD((NB.SI(grille;LIGNE(1:9))=9)*1) = 9


je retire toutes les bêtises que j'ai écrit depuis quelques minutes.
il ne suffit pas de vérifier toutes les sommes.
le carré magique 2 9 4 ; 7 5 3 ; 6 1 8 reproduit 9 fois y répond !
il faut donc bien vérifier la présence unique de chaque chiffre dans chaque
ligne, colonne, région.

Quelle est la sanction pour avoir écrit tant de conn... sur MPFE ?
Privé de Soduku pendant une semaine ;-(

Stéphane,

"SL" a écrit dans le message de news:

Exact, mais je me demandais simplement s'il était vraiment nécessaire de
le vérifier (ie si les conditions précédentes n'étaient pas suffisantes).
Ayant trouvé un contre-exemple (simple carré magique 3x3 reproduit 9
fois), il faut en effet vérifier également que la somme de chaque région
est bien 45.

Donc SOMME de chaque ligne, colonne, région = 45 et
SOMMEPROD((NB.SI(grille;LIGNE(1:9))=9)*1) = 9

Bonne journée également

Stéphane

"DanC" a écrit dans le message de news:

La somme de chaque région égale aussi 45, car chaque chiffre est unique
dans chaque région.
Ô sudoku quand tu nous tiens!
bonne journée!




--
(___) Danielle
(oo) "... A quoi bon la charrue
/------- et la voile, la terre et
|| || la vie sans la liberté?"
||---W|| * - Ralph Waldo Emerson
^^ ^^
"SL" a écrit dans le message de news:

Bonjour Serge
1er test : somme(grille) = 405 sinon "pas OK"
ensuite plutôt que de vérifer que chaque chiffre est présent 1 fois sur
chaque ligne, colonne, région, il suffit peut-être vérifier seulement
que la somme de chaque ligne et chaque colonne fait 45 et que chaque
chiffre est présent 9 fois dans la grille (je ne suis même pas sûr qu'il
faille vérifier la somme sur les régions).

Stéphane

"garnote" a écrit dans le message de news:

Bonjour, Bonjour,

Stie, je capote sur le Sudoku ;-)
Une question parmi tant d'autres :
Comment savoir si une grille remplie satisfait toutes
les conditions du Sudoku. Voici ma macro.
À votre avis, est-elle compétente pour répondre
à la question ? Peut-on procéder autrement ?

Marsu doku

Sarge


Option Base 1
Sub Sudoku()
B = Array("bloc1", "bloc2", "bloc3", "bloc4", "bloc5", "bloc6",
"bloc7", "bloc8", "bloc9")
For i = 1 To 9
For n = 1 To 9
t = WorksheetFunction.CountIf(Range("grille").Rows(i), n)
If t = 1 Then k = k + 1
Next n
Next i
For j = 1 To 9
For n = 1 To 9
t = WorksheetFunction.CountIf(Range("grille").Columns(j), n)
If t = 1 Then k = k + 1
Next n
Next j
For i = 1 To 9
For n = 1 To 9
t = WorksheetFunction.CountIf(Range(B(i)), n)
If t = 1 Then k = k + 1
Next n
Next i
If k = 243 Then MsgBox "OK" Else MsgBox "Pas OK"
End Sub