Je n'ai pas suivi le fil de cette conversation.
Mais j'ai moi même joué avec la résolution de Sudoku par curiosité.
J'ai trouvé un algorythme http://www-ljk.imag.fr/membres/Jerome.L ... sudoku.pdf
Voici mon code.
► Afficher le texte
Code : Tout sélectionner
#cs ----------------------------------------------------------------------------
AutoIt Version: 3.3.6.1
Author: Strofe
Script Function: Sudoku résolution
Web : http://www-ljk.imag.fr/membres/Jerome.Lelong/fichiers/Ensta/sudoku.pdf
#ce ----------------------------------------------------------------------------
; Début de section des directives.
#Region Compiler directives section
; Utiliser pour la compatibilité avec Win98 (Y).
#AutoIt3Wrapper_UseAnsi=N
; Icone(s) à rajouter dans les ressources de l'application compilée (Accepte les chemins relatifs).
#AutoIt3Wrapper_Res_Icon_Add=./Res/Icon.ico
; Icone de l'application compilée.
#AutoIt3Wrapper_Icon=./Res/Icon1.ico
; Nom du fichier compiler.
#AutoIt3Wrapper_OutFile=../Demo_v1.0.exe
; Format de sortie de l'application (A3X ou EXE).
#AutoIt3Wrapper_OutFile_Type=exe
; Déscription du script.
#AutoIt3Wrapper_Res_Description=Démo script
; Commentaire du script
#AutoIt3Wrapper_Res_Comment=Utilitaire de démo
; Version du script.
#AutoIt3Wrapper_Res_Fileversion=1.0
; Activation de l'incrémentation de version automatique.
#AutoIt3Wrapper_Res_FileVersion_AutoIncrement=n
; Information complèmentaire : Nom interne
#AutoIt3Wrapper_Res_Field=Nom Interne|Démo Script
; Information complèmentaire : date de compilation (Utilisation d'une variable).
#AutoIt3Wrapper_Res_Field=Compilation Date|%date%
; Information complèmentaire : heure de compilation (Utilisation d'une variable).
#AutoIt3Wrapper_Res_Field=Compilation Heure|%time%
; Information complèmentaire : version de AutoIt (Utilisation d'une variable).
#AutoIt3Wrapper_Res_Field=Version du Compilateur|AutoIt v%AutoItVer%
; Information complèmentaire : Entreprise.
#AutoIt3Wrapper_res_Field=Entreprise|Tuxolem Software
; Information complèmentaire : auteur.
#AutoIt3Wrapper_Res_Field=Créer par|Tlem
; Information complèmentaire : Email de l'auteur.
#AutoIt3Wrapper_Res_Field=Email|tlem at tuxolem.net
; Information complèmentaire : Copyright ou Copyleft.
#AutoIt3Wrapper_Res_LegalCopyright=Copyright (C) 2003-2007 Tuxolem Software
; Information complèmentaire : Langue du script.
#AutoIt3Wrapper_Res_Language=0x040c
; Utilisation de tidy lors du lancement du script (F5).
#AutoIt3Wrapper_run_tidy=y
; Paramètre de sauvegarde Tidy (Copie de sauvegarde du script 0 = Garde toutes les versions).
#Tidy_Parameters= /kv 0
; Utilisation de la compression pour générer l'EXE.
#AutoIt3Wrapper_UseUpx=y
; Taux de compression (2 est une bonne valeur).
#AutoIt3Wrapper_Compression=2
; Controle du script avec AU3Check
#AutoIt3Wrapper_Run_AU3Check=n
; Action à réalisée avant compilation.
#AutoIt3Wrapper_Run_Before=
; Action à réalisée après compilation.
#AutoIt3Wrapper_Run_After=
; Fin de la région directives.
#EndRegion
#cs
Tableau 81 cellules
Cellule (Région, Ligne, Colonne, liste des valeurs acceptables, Nb valeurs acceptables)
#ce
#Include <Array.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Local $T[82][6]
Global $A = "3;;;;4;5;;;1;;1;5;;;;;2;;7;;;3;8;;5;;;;8;;1;;;4;;2;9;;7;;5;;1;;6;1;;3;;;4;;5;;;;4;;7;8;;;3;;3;;;;;2;7;;6;;;5;2;;;;4"
;~ Global $A = ";;9;7;;8;;;;;6;;;1;;;4;;2;;;;;;;;;;7;;5;;;1;;8;;;2;;;;;;9;;1;8;2;9;;;;4;5;;;;;;;1;;;;1;;;3;6;8;;;;4;8;5;;;7;;"
;~ Global $A = ";8;;;;9;;;5;;;5;7;;1;;;6;6;7;;;2;5;1;;;;;8;;3;4;;5;;;9;;;;;6;4;2;5;4;;;;7;8;;3;7;;6;;5;;;;9;8;;;;9;;5;1;;;5;;1;7;2;;;"
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Sudoku", 613, 431, 192, 132)
$C01 = GUICtrlCreateInput("", 120, 48, 25, 24)
$C02 = GUICtrlCreateInput("", 152, 48, 25, 24)
$C03 = GUICtrlCreateInput("", 184, 48, 25, 24)
$C04 = GUICtrlCreateInput("", 224, 48, 25, 24)
$C05 = GUICtrlCreateInput("", 256, 48, 25, 24)
$C06 = GUICtrlCreateInput("", 288, 48, 25, 24)
$C07 = GUICtrlCreateInput("", 328, 48, 25, 24)
$C08 = GUICtrlCreateInput("", 360, 48, 25, 24)
$C09 = GUICtrlCreateInput("", 392, 48, 25, 24)
$C10 = GUICtrlCreateInput("", 120, 80, 25, 24)
$C11 = GUICtrlCreateInput("", 152, 80, 25, 24)
$C12 = GUICtrlCreateInput("", 184, 80, 25, 24)
$C13 = GUICtrlCreateInput("", 224, 80, 25, 24)
$C14 = GUICtrlCreateInput("", 256, 80, 25, 24)
$C15 = GUICtrlCreateInput("", 288, 80, 25, 24)
$C16 = GUICtrlCreateInput("", 328, 80, 25, 24)
$C17 = GUICtrlCreateInput("", 360, 80, 25, 24)
$C18 = GUICtrlCreateInput("", 392, 80, 25, 24)
$C19 = GUICtrlCreateInput("", 120, 112, 25, 24)
$C20 = GUICtrlCreateInput("", 152, 112, 25, 24)
$C21 = GUICtrlCreateInput("", 184, 112, 25, 24)
$C22 = GUICtrlCreateInput("", 224, 112, 25, 24)
$C23 = GUICtrlCreateInput("", 256, 112, 25, 24)
$C24 = GUICtrlCreateInput("", 288, 112, 25, 24)
$C25 = GUICtrlCreateInput("", 328, 112, 25, 24)
$C26 = GUICtrlCreateInput("", 360, 112, 25, 24)
$C27 = GUICtrlCreateInput("", 392, 112, 25, 24)
$C28 = GUICtrlCreateInput("", 120, 152, 25, 24)
$C29 = GUICtrlCreateInput("", 152, 152, 25, 24)
$C30 = GUICtrlCreateInput("", 184, 152, 25, 24)
$C31 = GUICtrlCreateInput("", 224, 152, 25, 24)
$C32 = GUICtrlCreateInput("", 256, 152, 25, 24)
$C33 = GUICtrlCreateInput("", 288, 152, 25, 24)
$C34 = GUICtrlCreateInput("", 328, 152, 25, 24)
$C35 = GUICtrlCreateInput("", 360, 152, 25, 24)
$C36 = GUICtrlCreateInput("", 392, 152, 25, 24)
$C37 = GUICtrlCreateInput("", 120, 184, 25, 24)
$C38 = GUICtrlCreateInput("", 152, 184, 25, 24)
$C39 = GUICtrlCreateInput("", 184, 184, 25, 24)
$C40 = GUICtrlCreateInput("", 224, 184, 25, 24)
$C41 = GUICtrlCreateInput("", 256, 184, 25, 24)
$C42 = GUICtrlCreateInput("", 288, 184, 25, 24)
$C43 = GUICtrlCreateInput("", 328, 184, 25, 24)
$C44 = GUICtrlCreateInput("", 360, 184, 25, 24)
$C45 = GUICtrlCreateInput("", 392, 184, 25, 24)
$C46 = GUICtrlCreateInput("", 120, 216, 25, 24)
$C47 = GUICtrlCreateInput("", 152, 216, 25, 24)
$C48 = GUICtrlCreateInput("", 184, 216, 25, 24)
$C49 = GUICtrlCreateInput("", 224, 216, 25, 24)
$C50 = GUICtrlCreateInput("", 256, 216, 25, 24)
$C51 = GUICtrlCreateInput("", 288, 216, 25, 24)
$C52 = GUICtrlCreateInput("", 328, 216, 25, 24)
$C53 = GUICtrlCreateInput("", 360, 216, 25, 24)
$C54 = GUICtrlCreateInput("", 392, 216, 25, 24)
$C55 = GUICtrlCreateInput("", 120, 256, 25, 24)
$C56 = GUICtrlCreateInput("", 152, 256, 25, 24)
$C57 = GUICtrlCreateInput("", 184, 256, 25, 24)
$C58 = GUICtrlCreateInput("", 224, 256, 25, 24)
$C59 = GUICtrlCreateInput("", 256, 256, 25, 24)
$C60 = GUICtrlCreateInput("", 288, 256, 25, 24)
$C61 = GUICtrlCreateInput("", 328, 256, 25, 24)
$C62 = GUICtrlCreateInput("", 360, 256, 25, 24)
$C63 = GUICtrlCreateInput("", 392, 256, 25, 24)
$C64 = GUICtrlCreateInput("", 120, 288, 25, 24)
$C65 = GUICtrlCreateInput("", 152, 288, 25, 24)
$C66 = GUICtrlCreateInput("", 184, 288, 25, 24)
$C67 = GUICtrlCreateInput("", 224, 288, 25, 24)
$C68 = GUICtrlCreateInput("", 256, 288, 25, 24)
$C69 = GUICtrlCreateInput("", 288, 288, 25, 24)
$C70 = GUICtrlCreateInput("", 328, 288, 25, 24)
$C71 = GUICtrlCreateInput("", 360, 288, 25, 24)
$C72 = GUICtrlCreateInput("", 392, 288, 25, 24)
$C73 = GUICtrlCreateInput("", 120, 320, 25, 24)
$C74 = GUICtrlCreateInput("", 152, 320, 25, 24)
$C75 = GUICtrlCreateInput("", 184, 320, 25, 24)
$C76 = GUICtrlCreateInput("", 224, 320, 25, 24)
$C77 = GUICtrlCreateInput("", 256, 320, 25, 24)
$C78 = GUICtrlCreateInput("", 288, 320, 25, 24)
$C79 = GUICtrlCreateInput("", 328, 320, 25, 24)
$C80 = GUICtrlCreateInput("", 360, 320, 25, 24)
$C81 = GUICtrlCreateInput("", 392, 320, 25, 24)
$Graphic1 = GUICtrlCreateGraphic(112, 40, 105, 105)
GUICtrlSetColor(-1, 0x3399FF)
$Graphic2 = GUICtrlCreateGraphic(112, 144, 105, 105)
GUICtrlSetColor(-1, 0x3399FF)
$Graphic3 = GUICtrlCreateGraphic(112, 248, 105, 105)
GUICtrlSetColor(-1, 0x3399FF)
$Graphic4 = GUICtrlCreateGraphic(216, 40, 105, 105)
GUICtrlSetColor(-1, 0x3399FF)
$Graphic5 = GUICtrlCreateGraphic(216, 144, 105, 105)
GUICtrlSetColor(-1, 0x3399FF)
$Graphic6 = GUICtrlCreateGraphic(216, 248, 105, 105)
GUICtrlSetColor(-1, 0x3399FF)
$Graphic7 = GUICtrlCreateGraphic(320, 40, 105, 105)
GUICtrlSetColor(-1, 0x3399FF)
$Graphic8 = GUICtrlCreateGraphic(320, 144, 105, 105)
GUICtrlSetColor(-1, 0x3399FF)
$Graphic9 = GUICtrlCreateGraphic(320, 248, 105, 105)
GUICtrlSetColor(-1, 0x3399FF)
$Btn_Calc = GUICtrlCreateButton("Calcul", 456, 80, 75, 25)
$Btn_Quitter = GUICtrlCreateButton("Quitter", 456, 288, 75, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
Affecte($T)
Affiche($T, True)
While 1
$Msg = GUIGetMsg()
Switch $Msg
Case $GUI_EVENT_CLOSE
Exit
Case $Btn_Quitter
Exit
Case $Btn_Calc
While Trouve_Possibilites($T)>0
Affiche($T,False)
WEnd
MsgBox(0,"Sudoku","Terminé")
EndSwitch
WEnd
Func Affecte(ByRef $MAT )
Local $Region = "1;1;1;2;2;2;3;3;3;1;1;1;2;2;2;3;3;3;1;1;1;2;2;2;3;3;3;4;4;4;5;5;5;6;6;6;4;4;4;5;5;5;6;6;6;4;4;4;5;5;5;6;6;6;7;7;7;8;8;8;9;9;9;7;7;7;8;8;8;9;9;9;7;7;7;8;8;8;9;9;9"
Local $Ligne = "1;1;1;1;1;1;1;1;1;2;2;2;2;2;2;2;2;2;3;3;3;3;3;3;3;3;3;4;4;4;4;4;4;4;4;4;5;5;5;5;5;5;5;5;5;6;6;6;6;6;6;6;6;6;7;7;7;7;7;7;7;7;7;8;8;8;8;8;8;8;8;8;9;9;9;9;9;9;9;9;9"
Local $Colonne = "1;2;3;4;5;6;7;8;9;1;2;3;4;5;6;7;8;9;1;2;3;4;5;6;7;8;9;1;2;3;4;5;6;7;8;9;1;2;3;4;5;6;7;8;9;1;2;3;4;5;6;7;8;9;1;2;3;4;5;6;7;8;9;1;2;3;4;5;6;7;8;9;1;2;3;4;5;6;7;8;9"
$reg = (StringSplit($Region,";"))
$lig = (StringSplit($Ligne,";"))
$col = (StringSplit($Colonne,";"))
$valA = (StringSplit($A,";"))
For $i = 1 to 81
$MAT[$i][1]=$reg[$i]
$MAT[$i][2]=$lig[$i]
$MAT[$i][3]=$col[$i]
$MAT[$i][4]=$valA[$i]
$MAT[$i][5]=0
If $valA[$i]<>"" Then $MAT[$i][5]=1
Next
EndFunc ;Affecte
Func Affiche($MAT, $premier)
For $i = 1 to 81
If $i <10 then
$Ou = Eval("C0" & $i)
Else
$Ou = Eval("C" & $i)
EndIf
If $T[$i][5] = 1 then
If GUICtrlRead($Ou) = "" Then
If $premier = False Then
GUICtrlSetColor($Ou, 0xff0000) ; Red
Else
GUICtrlSetColor($Ou, 0x000000) ; Black
EndIf
GUICtrlSetData($Ou, $MAT[$i][4])
EndIf
Else
GUICtrlSetData($Ou, "")
EndIf
Next
EndFunc ;Affiche
Func Trouve_Possibilites(ByRef $MAT)
$max = 0
;Pour chaque case
For $a=1 to 81
If $MAT[$a][5] <> 1 Then
$Possible = ""
$Ok = True
;Test chaque valeur
For $i = 1 to 9
If DansRegion($MAT, $a, $i) = True Then $Ok = False
If DansLigne($MAT, $a, $i) = True Then $Ok = False
If DansColonne($MAT, $a, $i) = True Then $Ok = False
If $Ok = True Then $Possible &= $i
$Ok = True
Next ;$i
If $Possible<>"" Then
$MAT[$a][4] = $Possible
$MAT[$a][5] = StringLen($Possible)
If $max < StringLen($Possible) Then $max = StringLen($Possible)
$Possible = ""
EndIf
EndIf
Next ;$a
return $max
EndFunc
Func DansRegion($MAT, $case, $valeur) ;N°de Case, Valeur à tester
$region = $MAT[$case][1]
For $r = 1 to 81
; Même région
If $MAT[$r][1] = $region Then
; Même valeur ?
If StringInStr($MAT[$r][4],$valeur)>0 And $MAT[$r][5]<=1 Then Return True
EndIf
Next ;$r
Return False
EndFunc ;DansRegion
Func DansLigne($MAT, $case, $valeur) ;N°de Case, Valeur à tester
$ligne = $MAT[$case][2]
For $r = 1 to 81
if $r <> $case Then
; Même Ligne
If $MAT[$r][2] = $ligne Then
; Même valeur ?
If StringInStr($MAT[$r][4],$valeur)>0 And $MAT[$r][5]<=1 Then Return True
EndIf
EndIf
Next ;$r
Return False
EndFunc ;DansLigne
Func DansColonne($MAT, $case, $valeur) ;N°de Case, Valeur à tester
$Colonne = $MAT[$case][3]
For $r = 1 to 81
if $r <> $case Then
; Même Colonne
If $MAT[$r][3] = $Colonne Then
; Même valeur ?
If StringInStr($MAT[$r][4],$valeur)>0 And $MAT[$r][5]<=1 Then Return True
EndIf
EndIf
Next ;$r
Return False
EndFunc ;DansColonne
A+

