我试图在多维数组中围绕现有的创建一个。它似乎起作用,但会产生下面解释的问题。
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
是找到行的列。i
和j
必须根据矩阵的行数和列数进行测试,以避免在边界上添加额外的点。如果你换成
@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