Ruby的二维数组

我试图接受一个二维数组,搜索大于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 

在此处输入图像描述

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

 def dilate(array) new_array=[] array.each{|i|new_array< 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的空格”,但是这样做是为了搜索包含大于零的值的空格。 我不确定这是不是你想要的。

我建议你使用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]]