【问题标题】:Algorithm to find and fill enclosed shapes on a grid在网格上查找和填充封闭形状的算法
【发布时间】:2017-01-19 16:30:36
【问题描述】:

假设我们有一个 0 的空网格:

0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

你可以在上面画形状。 1 表示填充单元格。

1 1 1 1 0 0 0 0
1 0 0 1 0 0 0 0
1 0 0 1 0 0 0 0
1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 0
0 1 1 0 0 1 1 1
1 0 0 1 0 1 0 0
0 1 1 0 0 1 0 0

如果四向填充算法不会泄漏并填充形状之外的任何单元格,则该形状被认为是封闭的。一个形状不能使用网格的边界作为它的边之一。所以如果我们用 2s 填充这个网格中的所有闭合形状,我们将有:

1 1 1 1 0 0 0 0
1 2 2 1 0 0 0 0
1 2 2 1 0 0 0 0
1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 0
0 1 1 0 0 1 1 1
1 2 2 1 0 1 0 0
0 1 1 0 0 1 0 0

实现洪水填充算法很容易,但我想不出一种方法来(以编程方式)填充网格中所有封闭的任意形状。我可以为此使用任何类型的算法或搜索吗?

【问题讨论】:

    标签: algorithm search grid shape flood-fill


    【解决方案1】:

    洪水填充算法有什么问题?简单有效,复杂度 O(N)。

    首先扫描边缘的零值并用标记值 3 填充空白区域。 然后穿过内部。如果找到零单元格,请从该单元格中填充值为 2。

    (也许你正在寻找类似connected-component labeling algorithm的东西。它旨在通过唯一的标记值标记每个连接的区域)

    【讨论】:

      【解决方案2】:

      您可以首先找到具有边界路径的零:

      取边界中的任意0个单元格,将其标记为-1,递归地对其所有相邻单元格执行此操作(邻居的邻居等都设置为-1)。一旦没有一个边界单元格为零,则将所有零单元格变为 2。这意味着它们仅被 1 包围。毕竟将所有 -1 变为 0。这是 O(n),其中 n 是网格中的单元数。

      这是一个(惰性)伪代码,假设我们有 n_1xn_2 个网格:

      function fill()
      {
       for int i=1..n_1
       {
         recursivecolor(i,1);
         recursivecolor(i,n_2);
       }
      
       for int j=1..n_2
       {
         recursivecolor(1,j);
         recursivecolor(n_1,j);
       }
      
       for i=1..n_1
         for j=1 .. n_2
           if (a[i][j] == 0)
             a[i][j] = 2;
      
       for i=1..n_1
         for j=1 .. n_2
           if (a[i][j] == -1)
             a[i][j] = 0;
      }
      
      
      function recursivecolor(i,j)
      {
         if (a[i][j]!=0) return;
      
         a[i][j] = -1;
         if (a[i-1][j] == 0)
         {   
            a[i-1][j] = -1;
            recursivecolor(i-1,j);
         }
         // do this for all neighbours of i,j cell
         // it also needs check for boundaries, e.g. i-1 should not be zero ...
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-22
        • 2013-01-20
        • 1970-01-01
        • 1970-01-01
        • 2014-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多