如果您只需要跟踪访问过的坐标并且它们的顺序无关紧要,那么您应该改用Set:
visited = Set.new
visited << [0,0]
visited << [1,0]
visited << [1,1]
visited << [1,0]
p visited
# => #<Set: {[0, 0], [1, 0], [1, 1]}>
p visited.include?([1,1])
# => true
如果由于某种原因您不能使用 Set,您可以使用 Hash 完成同样的事情(这基本上是 Set 在幕后工作的方式):
visited = {}
visited[ [0,0] ] = true
visited[ [1,0] ] = true
# Or:
visited.store([0, 0], true)
p visited
# { [0, 0] => true,
# [1, 0] => true
# }
p visited[ [1,0] ] # => true
p visited[ [2,5] ] # => nil
# Or:
p visited.key?([2,5]) # => false
这是一个如何在 Grid 类中使用 Set 的示例:
require 'set'
class Grid
attr_reader :visited
def initialize
@visited = Set.new
end
def visit!(x, y)
visited << [x, y]
end
def visited?(x, y)
visited.include?([x, y])
end
end
grid = Grid.new
grid.visit!(0, 0)
grid.visit!(1, 0)
grid.visit!(1, 1)
grid.visit!(1, 0)
p grid.visited
# => #<Set: {[0, 0], [1, 0], [1, 1]}>
p grid.visited?(1, 0) # => true
p grid.visited?(3, 3) # => false