Sviluppo4d.it
Sito indipendente di informazioni tecniche per sviluppatori 4th Dimension italiani  

Sviluppatori 4D

Utility 4D

Risorse 4D



4d logo
Naviga: Prev Next

Titolo: Programma risolutore Sudoku: metodo iterativo

Categoria: Codice Ultimo Aggiornamento: 19/01/06


Diamo seguito ad una faq precedente, pubblicando i metodi che permettono di risolvere un problema Sudoku utilizzando un sistema di programmazione iterativo.

`btElabora
ARRAY INTEGER(assudo;729)
ARRAY INTEGER(supos;81)
ARRAY INTEGER(sudo;81)

$x:=1
Repeat
    $pvar:=Get pointer("sudo"+String($x))
    If ($pvar->="")
        sudo{$x}:=0
    Else
        sudo{$x}:=Num($pvar->)
    End if
    $x:=$x+1
Until ($x>81)

$pp:=sudoarr (1)

$x:=1
Repeat
    supos{$x}:=0
    $x:=$x+1
Until ($x>81)



ARRAY INTEGER($vuoti;0)
$x:=1
$y:=1
Repeat
    
    If (sudo{$x}=0)
        INSERT ELEMENT($vuoti;$y)
        $vuoti{$y}:=$x
        $y:=$y+1
    End if
    $x:=$x+1
Until ($x>81)



$tempo:=Tickcount
    `Open window(200;200;300;350;16;"Elaborazione")
Open window(200;200;340;350;16;"Elaborazione")
sudomess

$x:=1


Repeat
    
    $posa:=supos{$vuoti{$x}}+1
    $posass:=($vuoti{$x}*9)-8
    
    If ($posa<10)
        supos{$vuoti{$x}}:=$posa
        sudo{$vuoti{$x}}:=assudo{$posass+$posa-1}
        sudomess
        If (assudo{$posass+$posa-1}#0)
          
           If ($x           $pp:=sudoarr ($vuoti{$x}+1)
           Else
           $pp:=True
           End if
           If ($pp)
           $x:=$x+1
           Else
           sudo{$vuoti{$x}}:=0
           sudomess
           If (assudo{$posass+$posa}=0)
           supos{$vuoti{$x}}:=0
           $x:=$x-1
           End if
          
           End if
        Else
           sudo{$vuoti{$x}}:=0
           sudomess
           supos{$vuoti{$x}}:=0
           $x:=$x-1
        End if
    Else
        sudo{$vuoti{$x}}:=0
        sudomess
        supos{$vuoti{$x}}:=0
        $x:=$x-1
    End if
    
    
Until ($x>Size of array($vuoti)) | ($x<1)

CLOSE WINDOW

$x:=1
Repeat
    $pvar:=Get pointer("sudo"+String($vuoti{$x}))
    $pvar->:=String(sudo{$vuoti{$x}})
    $x:=$x+1
Until ($x>Size of array($vuoti))

If ($x<1)
    ALERT("SOLUZIONE IMPOSSIBILE")
Else
    ALERT("Risolto in "+String(Int((Tickcount-$tempo)/60))+" secondi")
End if


`sudomess
riga1:=String(sudo{1})+" "+String(sudo{2})+" "+String(sudo{3})+" "+String(sudo{4})+" "+String(sudo{5})+" "+String(sudo{6})+" "+String(sudo{7})+" "+String(sudo{8})+" "+String(sudo{9})
riga2:=String(sudo{10})+" "+String(sudo{11})+" "+String(sudo{12})+" "+String(sudo{13})+" "+String(sudo{14})+" "+String(sudo{15})+" "+String(sudo{16})+" "+String(sudo{17})+" "+String(sudo{18})
riga3:=String(sudo{19})+" "+String(sudo{20})+" "+String(sudo{21})+" "+String(sudo{22})+" "+String(sudo{23})+" "+String(sudo{24})+" "+String(sudo{25})+" "+String(sudo{26})+" "+String(sudo{27})
riga4:=String(sudo{28})+" "+String(sudo{29})+" "+String(sudo{30})+" "+String(sudo{31})+" "+String(sudo{32})+" "+String(sudo{33})+" "+String(sudo{34})+" "+String(sudo{35})+" "+String(sudo{36})
riga5:=String(sudo{37})+" "+String(sudo{38})+" "+String(sudo{39})+" "+String(sudo{40})+" "+String(sudo{41})+" "+String(sudo{42})+" "+String(sudo{43})+" "+String(sudo{44})+" "+String(sudo{45})
riga6:=String(sudo{46})+" "+String(sudo{47})+" "+String(sudo{48})+" "+String(sudo{49})+" "+String(sudo{50})+" "+String(sudo{51})+" "+String(sudo{52})+" "+String(sudo{53})+" "+String(sudo{54})
riga7:=String(sudo{55})+" "+String(sudo{56})+" "+String(sudo{57})+" "+String(sudo{58})+" "+String(sudo{59})+" "+String(sudo{60})+" "+String(sudo{61})+" "+String(sudo{62})+" "+String(sudo{63})
riga8:=String(sudo{64})+" "+String(sudo{65})+" "+String(sudo{66})+" "+String(sudo{67})+" "+String(sudo{68})+" "+String(sudo{69})+" "+String(sudo{70})+" "+String(sudo{71})+" "+String(sudo{72})
riga9:=String(sudo{73})+" "+String(sudo{74})+" "+String(sudo{75})+" "+String(sudo{76})+" "+String(sudo{77})+" "+String(sudo{78})+" "+String(sudo{79})+" "+String(sudo{80})+" "+String(sudo{81})

GOTO XY(2;1)
MESSAGE(riga1)
GOTO XY(2;2)
MESSAGE(riga2)
GOTO XY(2;3)
MESSAGE(riga3)
GOTO XY(2;4)
MESSAGE(riga4)
GOTO XY(2;5)
MESSAGE(riga5)
GOTO XY(2;6)
MESSAGE(riga6)
GOTO XY(2;7)
MESSAGE(riga7)
GOTO XY(2;8)
MESSAGE(riga8)
GOTO XY(2;9)
MESSAGE(riga9)



`sudoarr
C_INTEGER($1)
C_BOOLEAN($0)
$pieno:=True
$x:=$1
Repeat
    $posass:=($x*9)-8
    If (sudo{$x}=0)
        $z:=$posass
        $zz:=1
        Repeat
           assudo{$z}:=0
           $z:=$z+1
           $zz:=$zz+1
        Until ($zz>9)
        $y:=1
        $pos:=0
        $arr:=0
        sudopos ($x)
        Repeat
           If (ChkRiga ($x;$y))
           assudo{$posass+$pos}:=$y
           $arr:=$arr+assudo{$posass+$pos}
           $pos:=$pos+1
           End if
           $y:=$y+1
        Until ($y>9)
        If ($arr=0)
           $pieno:=False
        End if
    End if
    $x:=$x+1
Until ($x>81) | ($pieno=False)
$0:=$pieno



`sudopos
C_INTEGER($1)
C_BOOLEAN($0)
$pieno:=True
$x:=$1
Repeat
    $posass:=($x*9)-8
    If (sudo{$x}=0)
        $z:=$posass
        $zz:=1
        Repeat
           assudo{$z}:=0
           $z:=$z+1
           $zz:=$zz+1
        Until ($zz>9)
        $y:=1
        $pos:=0
        $arr:=0
        sudopos ($x)
        Repeat
           If (ChkRiga ($x;$y))
           assudo{$posass+$pos}:=$y
           $arr:=$arr+assudo{$posass+$pos}
           $pos:=$pos+1
           End if
           $y:=$y+1
        Until ($y>9)
        If ($arr=0)
           $pieno:=False
        End if
    End if
    $x:=$x+1
Until ($x>81) | ($pieno=False)
$0:=$pieno


`ChkRiga
C_INTEGER($1)
C_INTEGER($2)
C_BOOLEAN($0)

$giusto:=True
$cas:=$1
$num:=$2


$inriga:=suriga*9-8
$finriga:=$inriga+8

Repeat
    If (sudo{$inriga}=$num)
        $giusto:=False
    End if
    $inriga:=$inriga+1
Until ($giusto=False) | ($inriga>$finriga)

If ($giusto)
    $incol:=sucol
    $fincol:=72+sucol
    Repeat
        If (sudo{$incol}=$num)
           $giusto:=False
        End if
        $incol:=$incol+9
    Until ($giusto=False) | ($incol>$fincol)
    
    If ($giusto)
        $inq:=suiq
        $finq:=suiq+20
        
        $x:=1
        Repeat
           If (sudo{$inq}=$num)
           $giusto:=False
           End if
           If ($x=3)
           $inq:=$inq+7
           $x:=1
           Else
           $inq:=$inq+1
           $x:=$x+1
           End if
          
        Until ($giusto=False) | ($inq>$finq)
        
    End if
    
End if

$0:=$giusto




Inviato da: Cristiano Cristiani Visite: 12285

Se accedi con utente e password, puoi aggiungere dei commenti.


Accesso

User:
Pass: Accedi

Cerca

Se non trovi le informazioni che cerchi scrivi a aiuto@sviluppo4d.it

4D Principali

4D Discussioni

Faq random


Crediti

Dominio registrato da ZetaNet
Sito realizzato da Nexus srl
4D SQL 11.9.0 offerto da 4D & Italsoftware
Icone di FAMFAMFAM
Moderato da Umberto Migliore
333 utenti registrati

Pagina servita il 21/12/24 alle 18:58:44 Valid HTML 4.01! Valid CSS!

Mutuo Facile, iDigitalScout, iDigitalTags e altre app di Nexid srl per iPhone e iPad

Cidroid, distributore italiano lettori barcode per IOS Apple iPhone, iPod, iPad