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.