Mercurial > maze-src
diff distances.rb @ 0:1eef88068f9f tip
initial commit of maze game source
| author | ferencd |
|---|---|
| date | Sun, 15 Sep 2019 11:46:47 +0200 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/distances.rb Sun Sep 15 11:46:47 2019 +0200 @@ -0,0 +1,60 @@ +#--- +# Excerpted from "Mazes for Programmers", +# published by The Pragmatic Bookshelf. +# Copyrights apply to this code. It may not be used to create training material, +# courses, books, articles, and the like. Contact us if you are in doubt. +# We make no guarantees that this code is fit for any purpose. +# Visit http://www.pragmaticprogrammer.com/titles/jbmaze for more book information. +#--- +class Distances + def initialize(root) + @root = root + @cells = {} + @cells[@root] = 0 + end + + def [](cell) + @cells[cell] + end + + def []=(cell, distance) + @cells[cell] = distance + end + + def cells + @cells.keys + end + + def path_to(goal) + current = goal + + breadcrumbs = Distances.new(@root) + breadcrumbs[current] = @cells[current] + + until current == @root + current.links.each do |neighbor| + if @cells[neighbor] < @cells[current] + breadcrumbs[neighbor] = @cells[neighbor] + current = neighbor + break + end + end + end + + breadcrumbs + end + + def max + max_distance = 0 + max_cell = @root + + @cells.each do |cell, distance| + if distance > max_distance + max_cell = cell + max_distance = distance + end + end + + [max_cell, max_distance] + end +end
