```I should be doing real work, but.....

I found a big speedup for the worst cases.  I was looking at the debug
output for puzzle 50.
+-------+-------+-------+
| 7 _ _ | _ _ _ | _ 1 9 |
| 4 6 _ | 1 9 _ | _ _ _ |
| _ _ _ | 6 8 2 | 7 _ 4 |
+-------+-------+-------+
| _ 9 _ | _ _ _ | _ _ 7 |
| _ _ _ | 3 _ _ | 4 _ 5 |
| _ _ 6 | 7 _ _ | _ _ _ |
+-------+-------+-------+
| _ _ 1 | _ _ _ | _ _ _ |
| 2 _ _ | _ 7 4 | _ _ _ |
| _ _ _ | 2 _ _ | 3 _ _ |
+-------+-------+-------+

I noticed that it spent a lot of time making wrong guesses and only
filling in the upper left corner.
104 guesses to 36.

before:
\$> for i in *.sdk; do time ruby SodukuSolver.rb \$i   ; done >btime 2>&1
\$> ruby parsetime.rb btime
min     max     total   ave
0.032   2.604   14.299  0.259

after:
min     max     total   ave
0.031   0.938   12.667  0.230

And it was a simple change:
in Cell.initialize, replace
@box = col/(bounds[0])+((row/bounds[1])*bounds[1])
with
@box = (col/(bounds[0])+((row/bounds[1])*bounds[1])+max/2)%max
to make the box in the center have 0 index.

and replace the function Solver.guess so that it iterates over the
def guess
2.upto(@size) do |min|
@boxes.each do |set|
set.each do |cell|
if cell.possible.size == min
g = Guess.new(cell)
cell.set(g.value)
@queue << cell
dprint g
return g
end
end
end
end
dprint "did not find a guess\n"
return nil
end

Ok, I'm done now.