我是初学者,需要完成一些练习。我正在尝试操作一个二维数组,如果一个元素为 1,则周围的非对角线元素应更改为 1:
[[0,0,0,0],
[0,0,1,0],
[0,0,0,0],
[0,0,0,0]]
应该返回
[[0,0,1,0],
[0,1,1,1],
[0,0,1,0],
[0,0,0,0]]
我在使用嵌套的 each_with_index 时遇到了问题:在我调整了左右周围的初始更改后,随着方法的迭代,它通过先前的调整拾取并进行了不需要的更改。此外,应该更改“底部”元素的行会引发错误:
a = [[0,0,0,0],
[0,0,1,0],
[0,0,0,0],
[0,0,0,0]
]
a.each_with_index do |m, n| # n == index of main array
m.each_with_index do |x, y| # y == index of subarray
if x == 1
a[n][y+1] = 1 unless (a[n][y+1]).nil? #right
a[n][y-1] = 1 unless (a[n][y-1]).nil? #left
a[n-1][y] = 1 unless (a[n-1][y]).nil? #top
a[n+1][y] = 1 unless (a[n+1][y]).nil? #bottom--currently giving an error
end
end
end
任何关于我如何着手解决这两个方面的建议都会受到欢迎。
最佳答案
为了避免上一步的干扰,您可以(深度)复制数组并将引用数组与修改数组分开,或者在修改数组之前提取所有相关索引。后者更好。此外,使用平面数组比处理嵌套数组容易得多,因此我将 a
与平面数组 b
相互转换,并在 b< 中工作
.
b = a.flatten
b
.each_index.select{|i| b[i] == 1}
.each do
|i|
b[i - 1] = 1 if b[i - 1] and i - 1 >= 0
b[i + 1] = 1 if b[i + 1]
b[i - 4] = 1 if b[i - 4] and i - 4 >= 0
b[i + 4] = 1 if b[i + 4]
end
a = b.each_slice(4).to_a
# => [[0, 0, 1, 0], [0, 1, 1, 1], [0, 0, 1, 0], [0, 0, 0, 0]]
关于arrays - 更改数组元素的周围元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36673138/