我正在处理来自adventofcode.com的问题。我需要跟踪未确定网格上的运动。我创建了一个使用case方法的移动函数。
def move(direction)
case move
when ">"
x += 1
when "<"
x -= 1
when "^"
y += 1
when "v"
y -= 1
end
end
我必须跟踪所访问的坐标,我想创建一个二维数组,当我们访问一个新位置时,它会跟踪并推到它的后面。我不知道的是如何使用if语句跟踪唯一的访问位置。
答案 0 :(得分:4)
如果您只需要跟踪访问过的坐标并且它们的顺序无关紧要,那么您应该使用fiddle代替:
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