Titolo: Programma risolutore Sudoku: metodo ricorsivo
Categoria: Codice |
|
Ultimo Aggiornamento: 19/01/06 |
Per dimostrare l'equivalenza tra procedure iterative e procedure ricorsive, pubblichiamo due metodi per risolvere uno schema Sudoku 9x9x9.
Ecco la soluzione del Sudoku ricorsiva:
`Solver
$prossimo:=$1
If ($prossimo>0)
$row:=($prossimo\9)+(1*Num(Mod($prossimo;9)>0))
$column:=$prossimo-(($row-1)*9)
$0:=
False For ($i;1;9)
arrValori{$row}{$column}:=$i
If (CheckRules ($row;$column))
$0:=Solver (GetNext )
End if If ($0)
$i:=12
End if End for If ($0=
False)
arrValori{$row}{$column}:=0
End ifElse $0:=
TrueEnd if`CheckRules
$0:=
True$row:=$1
$column:=$2
$valore:=arrValori{$row}{$column}
For ($i;1;9)
If ((($i#$row) & (arrValori{$i}{$column}=$valore)) | (($i#$column) & (arrValori{$row}{$i}=$valore)))
$0:=
False $i:=12
End ifEnd forIf ($0)
$firstcol:=($column-1\3)*3
$firstrow:=($row-1\3)*3
For ($i;1;3)
For ($j;1;3)
$checkRow:=$firstrow+$i
$checkCol:=$firstcol+$j
If ((Not(($checkRow=$row) & ($checkCol=$column))) & (arrValori{$checkRow}{$checkCol}=$valore))
$0:=
False $i:=12
$j:=12
End if End for End forEnd if`GetNext
ARRAY LONGINT($arrPosizione;0)
ARRAY LONGINT($arrQuanti;0)
For ($i;1;9)
For ($j;1;9)
If ((arrFissi{$i}{$j}=
False) & (arrValori{$i}{$j}=0))
INSERT ELEMENT($arrPosizione;Size of array($arrPosizione)+1)
INSERT ELEMENT($arrQuanti;Size of array($arrQuanti)+1)
$arrPosizione{Size of array($arrPosizione)}:=(($i-1)*9)+$j
For ($valore;1;9)
arrValori{$i}{$j}:=$valore
If (CheckRules ($i;$j))
$arrQuanti{Size of array($arrQuanti)}:=$arrQuanti{Size of array($arrQuanti)}+1
End if End for arrValori{$i}{$j}:=0
End if End forEnd forMULTI SORT ARRAY($arrQuanti;>;$arrPosizione;>)
If (Size of array($arrQuanti)>0)
$0:=$arrPosizione{1}
Else $0:=0
End if
Inviato da: PierPaolo Sichera |
|
Visite: 14118 |
Se accedi con utente e password, puoi aggiungere dei commenti.