Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 查找网格的最小封闭区域_Arrays_Math_Matrix_Discrete Mathematics - Fatal编程技术网

Arrays 查找网格的最小封闭区域

Arrays 查找网格的最小封闭区域,arrays,math,matrix,discrete-mathematics,Arrays,Math,Matrix,Discrete Mathematics,有一个网格,其边缘总是墙 栅格的内部区域也由墙划分为几个子区域,如下所示 1=墙, 0=空 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0

有一个网格,其边缘总是墙

栅格的内部区域也由墙划分为几个子区域,如下所示

1=墙, 0=空

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0 0 0 1 0 0 0 0 0 0 0 0 0 1
1 0 0 0 1 0 0 0 0 0 0 0 0 0 1
1 0 0 0 1 0 0 0 0 0 0 0 0 0 1
1 1 1 1 1 0 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 1 1 1 0 0 0 1
1 0 0 0 0 0 0 0 1 0 1 1 1 1 1
1 0 0 0 0 0 0 0 1 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
我需要找到最小的空分区。
我该怎么做?望远镜的建议是正确的。这里有一个稍微更详细的说明,说明您可能如何处理这个问题

给定一个mxn网格,您将在(M-2)(N-2)子网格上循环,忽略外墙。查看给定网格单元时:

  • 如果网格单元为0,则表示尚未看到此区域;在此处开始洪水填充,计算相邻0的数量,并将其更改为2,以将其标记为已在某个封闭区域中看到,以避免以后再次淹没该区域

  • 如果栅格单元为1,则该单元为内墙,应跳过

  • 如果网格单元为2,则您已经看到该区域,可以跳过它

最后,您将计算每个不同封闭部分的面积,并可以选择最大、最小或任何您需要知道的区域


此算法最多会访问每个单元几次(最坏的情况是1被0包围,洪水填充最多会碰撞四次,并且在子网格扫描期间会检查一次墙)。因此,时间复杂度为O(MN)。该算法使用网格本身来跟踪它到目前为止所做的事情,因此没有使用额外的内存;如果不能就地修改网格,可以为工作副本分配额外的O(MN)内存。

这可以通过泛洪填充算法解决。