如何在二维数组中跟踪和查找坐标

时间:2015-12-04 22:05:32

标签: ruby

我正在处理来自adventofcode.com的问题。我需要跟踪未确定网格上的运动。我创建了一个使用case方法的移动函数。

def move(direction)
  case move
  when ">"
    x += 1
  when "<"
    x -= 1
  when "^"
    y += 1
  when "v"
    y -= 1
  end
end

我必须跟踪所访问的坐标,我想创建一个二维数组,当我们访问一个新位置时,它会跟踪并推到它的后面。我不知道的是如何使用if语句跟踪唯一的访问位置。

1 个答案:

答案 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