And here is an iterative, breadth-first search that can be used in
place of my find_path_recurse().
module Knight
def self.find_path_bf(pStart, pEnd, forbidden)
# Are we there yet?
#
return [pEnd.clone] if pStart == pEnd
# You can't get there from here!
#
return nil if forbidden.include?(pEnd)
position_list = Hash.new
forbidden.each {|f| position_list[f] = 'forbidden' }
position_list[pStart] = []
moves_to_check = [pStart]
until moves_to_check.empty? do
pos = moves_to_check.shift
possible_moves(pos).each do |m|
next if position_list[m]
position_list[m] = position_list[pos] + [m]
return position_list[m] if m == pEnd
moves_to_check.push(m)
end
end
nil
end
end
-- Timothy