我试图在多维数组中围绕现有的创建一个。它似乎起作用,但会产生下面解释的问题。

class Image


  def initialize(pixle)
    @pixle = pixle
  end

  def output_image
    @pixle.each do |row|
      puts row.join("")
    end
  end

  def find_ones
    ones = []
    @pixle.each_with_index do |row, i|
      row.each_with_index do |val, j|
        if val == 1
          ones << [i, j]
        end
      end
    end


     ones.each do |i, j|
       @pixle[i][j - 1] = 1 unless j == 0
       @pixle[i][j + 1] = 1 unless j == -1
       @pixle[i - 1][j] = 1 unless i == 0
       @pixle[i + 1][j] = 1 unless i == -1
     end
     output_image
  end

end

image = Image.new([
  [1, 0, 0, 0],
  [0, 0, 0, 1], #this one adds extra one outside array
  [0, 0, 0, 0],
  [0, 0, 0, 1] #if last index is 0 it works
])

image.find_ones

此代码适用于大多数情况,如果将一个添加到最后一个数组的最后一个索引,则会引发错误…如果将1添加到其他数组的最后一个索引,则还会添加额外的1。
expected result
1101
1011
0001
0011

最佳答案

我认为问题出在这里:

   @pixle[i][j + 1] = 1 unless j == -1
   @pixle[i + 1][j] = 1 unless i == -1

i是行,j是找到行的列。
ij必须根据矩阵的行数和列数进行测试,以避免在边界上添加额外的点。
如果你换成
   @pixle[i][j + 1] = 1 unless j == 3
   @pixle[i + 1][j] = 1 unless i == 3

它按预期工作。
更一般地说,你应该选择矩阵的大小并在你的语句中使用它,例如
@rows = pixle.size
@cols = pixle[0].size

因此,由于我们需要考虑索引,它可以变成:
@pixle[i][j + 1] = 1 unless j == @cols -1
@pixle[i + 1][j] = 1 unless i == @rows - 1

10-04 12:50