Thanks for your "general comments".
I made a little adjustment to the algortihm (added ceiling) which makes it
much faster.
Steven
class NumericMaze
def solve (from, to)
return [from] if from == to
@done = {from => :from, -to => :to}
@todo = [from, -to]
@max = [from*2+2, to*2].max
catch :found do
loop do
t = @todo.shift
add_edge(2*t, t)
add_edge(t+2, t) if (t <- 2) || (0 <= t)
add_edge(t/2,t) if t.modulo(2) == 0
end
end
return @result
end
def add_edge(new, from)
return unless @done[new] == nil
return if new > @max
@done[new] = from
if @done[-new] then #path found
@result = calc_path(new.abs)
throw :found
end
@todo.push new
end
def calc_path(middle)
pathway = [middle]
t = middle
pathway.unshift(t) until (t = @done[t]) == :from
t = -middle
pathway.push(-t) until (t = @done[t]) == :to
return pathway
end
end