Ruby的二维数组

时间:2015-02-28 01:50:38

标签: ruby arrays

我正在尝试接收2D数组,搜索大于0的任何空格,然后将周围空格增加1。

array = [[0,0,0], [0,1,0], [0,0,0]]

最终输出应如下所示

new_array = [[0,1,0], [1,1,1], [0,1,0]]

我目前设置的方式是返回

[1,1,1,1]

正在增加正确的空间,我想,我只是不确定如何将它们放回原始数组然后返回2D数组。显然缺少一些步骤,任何帮助将不胜感激。我理解为什么它会以它的方式返回,只是不清楚下一步。

def dilate(array)
  new_array = []
  array.each_with_index do |row, rowIndex|
    row.each_with_index do |col, colIndex|
      if (array[rowIndex][colIndex] > 0)
        new_array << (array[rowIndex][colIndex -1] +1)
        new_array << (array[rowIndex -1][colIndex] +1)
        new_array << (array[rowIndex][colIndex +1] +1)
        new_array << (array[rowIndex +1][colIndex] +1)
      end
    end
  end
  return new_array
end

enter image description here

2 个答案:

答案 0 :(得分:2)

您正在做的是初始化一个空数组new_array,并向其追加元素。您将增加的值附加到新数组,而不是更改数组中的值。这样的事情应该有效:

def dilate(array)
  new_array=[]
  array.each{|i|new_array<<i.dup}
  array.each_with_index do |row, rowIndex|
    row.each_with_index do |col, colIndex|
      if (array[rowIndex][colIndex] > 0)
        new_array[rowIndex][colIndex -1] += 1 if colIndex > 0
        new_array[rowIndex -1][colIndex] += 1 if rowIndex > 0
        new_array[rowIndex][colIndex +1] += 1 if colIndex < array.first.size-1
        new_array[rowIndex +1][colIndex] += 1 if rowIndex < array.size-1
      end
    end
  end
  return new_array
end

我正在创建一个新数组new_array,它是array的副本,然后递增其元素。

顺便说一下,你在问题中说你想要搜索包含1&#34;的任何空格,但是这样做是为了搜索包含大于零的值的空格。我不确定这是不是你想要的。

答案 1 :(得分:1)

我建议您使用课程Matrix。它使操作变得简单易读。

<强>代码

require 'matrix'

def dilate(arr)
  nrows, ncols = arr.size, arr[0].size
  m = Matrix[*arr]
  m.each_with_index.reduce(m.dup) { |mout, (e, row, col)|
    mout + Matrix.build(nrows, ncols) { |i,j|
      adjacent?(i,j,row,col) ? e : 0 } }.to_a
end

def adjacent?(r0,c0,r1,c1)
  ((r0-r1).abs == 1 && (c0==c1)) || ((c0-c1).abs == 1 && (r0==r1))
end

我假设,当元素的值x非零时,您希望通过x增加相邻元素的值。如果要按1增加相邻元素的值,请更改:

Matrix.build(nrows, ncols) { |i,j| adjacent?(i,j,row,col) ? e : 0 }

为:

Matrix.build(nrows, ncols) { |i,j| adjacent?(i,j,row,col) ? 1 : 0 }

<强>实施例

arr = [[0, 0, 0],
       [0, 1, 0],
       [0, 0, 0]]           
dilate(arr)
  #=> [[0, 1, 0],
  #    [1, 1, 1],
  #    [0, 1, 0]] 

arr = [[0, 0, 0, 0],
       [0, 1, 0, 0],
       [0, 0, 0, 0]]           
dilate(arr)
  #=> [[0, 1, 0, 0],
  #    [1, 1, 1, 0],
  #    [0, 1, 0, 0]]

arr = [[1, 0, 0],
       [0, 0, 0],
       [0, 0, 0]]
dilate(arr)
  #=> [[1, 1, 0],
  #    [1, 0, 0],
  #    [0, 0, 0]] 

arr = [[0, 0, 0],
       [1, 0, 0],
       [0, 0, 0]]
dilate(arr)
  #=> [[1, 0, 0],
  #    [1, 1, 0],
  #    [1, 0, 0]] 

arr = [[0, 0, 1],
       [0, 0, 0],
       [0, 0, 0]]
dilate(arr)
  #=> [[0, 1, 1],
  #    [0, 0, 1],
  #    [0, 0, 0]]

arr = [[0, 0, 0, 3],
       [0, 1, 1, 0],
       [0, 4, 1, 0],
       [2, 0, 0, 0]]    
dilate(arr)
  #=> [[0, 1, 4, 3],
  #    [1, 6, 3, 4],
  #    [6, 6, 6, 1],
  #    [2, 6, 1, 0]]