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