Arrays 在Julia中如何在2D数组中实现泛洪填充? 问题

Arrays 在Julia中如何在2D数组中实现泛洪填充? 问题,arrays,julia,flood-fill,Arrays,Julia,Flood Fill,假设我有一个2D矩阵,其中一些随机整数是0或1。如何对阵列中的连续区域进行泛洪填充 该算法特别适用于图像处理,在封闭区域(如绘制桶工具)中用另一种颜色填充颜色 例子 假设我的数组是: 1 0 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 1 0 0 0 1 1 0 0 0 1 1 1 1 我想在右上角的1s区域填充类似8的内容。我如何实现这一点?我知道该地区任何1的索引,并且我有任何1s的索引 填充8s后,数组应如下所示: 1 0 8 8 8 8 0 0 0

假设我有一个2D矩阵,其中一些随机整数是
0
1
。如何对阵列中的连续区域进行泛洪填充

该算法特别适用于图像处理,在封闭区域(如绘制桶工具)中用另一种颜色填充颜色

例子 假设我的数组是:

1 0 1 1 1 1 0
0 0 1 1 1 1 1
0 0 0 1 1 1 1
0 1 0 0 0 1 1
0 0 0 1 1 1 1
我想在右上角的
1
s区域填充类似
8
的内容。我如何实现这一点?我知道该地区任何
1
的索引,并且我有任何
1
s的索引

填充
8
s后,数组应如下所示:

1 0 8 8 8 8 0
0 0 8 8 8 8 8
0 0 0 8 8 8 8
0 1 0 0 0 8 8
0 0 0 8 8 8 8 
我的努力: 我尝试过以下方法:

  • 检查数组中的每个项目,检查它是否为
    1
    ,并将其替换为
    8
    。显然,这不起作用,因为它只是将所有的
    1
    s替换为
    8
    s。甚至区域外的
    1
    s也被转换为
    8
    s
  • 使用相对坐标,检查
    1
    s,并将初始索引替换为
    8
    s。简而言之,将值为
    1
    的所有邻居替换为
    8
    。这也不起作用,因为它只替换了最近的8个邻居,并没有像我希望的那样填充该区域

    • 瞧!答案在于递归:

      该函数将数组中的
      arr
      ,以及以元组
      (x,y)
      形式知道的
      1
      的坐标(或索引)作为参数

      使用相对坐标时,我们对每个坐标调用flood_fill函数:

      function flood_fill(arr, (x, y))
          # check every element in the neighborhood of the element at (x, y) in arr
          for x_off in -1:1
              for y_off in -1:1
                  # put the next part in a try-catch block so that if any index
                  # is outside the array, we move on to the next element.
                  try
                      # if the element is a 1, change it to an 8 and call flood_fill 
                      # on it so it fills it's neighbors
                      if arr[x + x_off, y + y_off] == 1
                          arr[x + x_off, y + y_off] = 8
                          flood_fill(arr, (x + x_off, y + y_off))
                      end
                  catch
                      continue
                  end
              end
          end
      end