【问题标题】:How to track and look up coordinates in a 2d array如何在二维数组中跟踪和查找坐标
【发布时间】:2015-12-04 22:05:31
【问题描述】:

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

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

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

【问题讨论】:

    标签: ruby


    【解决方案1】:

    如果您只需要跟踪访问过的坐标并且它们的顺序无关紧要,那么您应该改用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
    

    【讨论】:

    • 如果visit! 将返回self 而不管元素是否已添加到集合中,Set#add(又名&lt;&lt;)是合适的。 Set#add? 也很有用,因为它可以添加元素,但如果不能,则返回 nil,如果需要该信息,则无需执行 visited?。因此,将这两种方法都用于添加元素可能是值得的。
    • 这真的很有趣。我以前从未听说过套装。它可能会工作,我明天会测试它。我只需要独特的位置,这样我就可以在其上使用 .length 并且它们是否会在重新访问这些位置时重复自己?
    • 是的,您可以使用Set#size 或其别名length 来获取集合的基数。我不确定您所说的“重复自己”是什么意思,但是您可以在上面看到当您将相同的项目添加到集合中两次(集合只保留一个)时会发生什么。
    猜你喜欢
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 2021-06-26
    • 2021-05-22
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多