Solve loop:
ROUND:
while ( 1 )
{
SQUARE:
for my $curblock ( @{ $sobj->{"square"} } )
{
if ( $sobj->{patience}-- < 1 )
{
last ROUND;
}
next SQUARE if $curblock->{known};
## Naked singles:
## --------------------------------------------------
my %guesses = map { $_ => $_ }
( @{ $curblock->{guess} } );
$_->{known} && delete $guesses{ $_->{value} }
for (
@{ $sobj->{col}->[ $curblock->{col} ] },
@{ $sobj->{row}->[ $curblock->{row} ] },
@{ $sobj->{block}->[ $curblock->{block}] },
);
# a block has no possible values, no solutions
return ( SUDOKU_UNSOLVABLE, $round, undef )
unless scalar keys %guesses;
if ( scalar( keys %guesses ) == 1 )
{
last ROUND
unless mark_known( $sobj, $curblock, ( keys %guesses )[0] );
next SQUARE;
} else {
$curblock->{guess} = [ sort keys %guesses ];
}
}
}