适合空间的最大模式数

时间:2018-04-25 22:06:11

标签: algorithm

假设您有一个布尔值,n - by - m,随机初始化的数组A,并假设您有一个布尔值p - 由 - q,随机初始化的数组B,其中p <= nq <= m

我想知道B适合A的最大数量:我说B符合A not (A[k + i, l + j] and B[i, j])对于每个true和每个0 <= i < p0 <= j < q0 <= k < n - p,{1}}为0 <= l < m - q

简单来说,我有一个模式和一个有障碍物的地图,我想知道适合所述地图的最大模式数量。我使用truefalse分别代表占用空间和未占用空间的约定。

我目前正在通过递归解决这个问题,但效率非常低。我想知道是否有更好的方法。我甚至会感谢参考。

修改1 :我对非重叠B的最大数量感兴趣。

编辑2 :让A成为以下数组:

enter image description here

B成为以下数组:

enter image description here

请注意,我将B及其中心设为不同的颜色,仅供观看。

然后我可以通过以下两种方式将B放入A

enter image description here enter image description here

在第一张图片中,我能够容纳六个B。然而,在第二张图片中,我能够适应九个。我对最大数量感兴趣。

1 个答案:

答案 0 :(得分:0)

我能想到的最直接的方法是最坏情况 O(mnpq)。将矩阵B视为位于矩阵A之上的模板。对于x,yA的每个位置,其中B可以放置在该位置的左上角(x,y),以便所有矩阵{{1} {}包含在B内(这些位置有(mp)(nq)),检查每个A0<=i<p,{{1} {}}和0<=j<q都不是B[i][j]。计算发生这种情况的位置数。此代码将使用四个嵌套的A[x+i][y+j]循环,并完全避免递归。

如果1恰好是稀疏的(少数位置为if),则向后工作会更有效,并指出无法放置A的位置。从大小为true的矩阵B开始,初始化为C。扫描A表示true为真的所有位置,并记下A的左上角是否放置A[x][y] B的值true }会与B中的true发生碰撞。设置A的所有值,其值等于C。完成后,求和矩阵false将为您提供不发生碰撞的位置数。