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.
So I made the guesser start with the center box instead.  It went from
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
boxes instead of the rows:
    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.
-Adam