假设您有一个布尔值,n
- by - m
,随机初始化的数组A
,并假设您有一个布尔值p
- 由 - q
,随机初始化的数组B
,其中p <= n
和q <= m
。
我想知道B
中适合的A
的最大数量:我说B
符合A
not (A[k + i, l + j] and B[i, j])
对于每个true
和每个0 <= i < p
,0 <= j < q
和0 <= k < n - p
,{1}}为0 <= l < m - q
。
简单来说,我有一个模式和一个有障碍物的地图,我想知道适合所述地图的最大模式数量。我使用true
和false
分别代表占用空间和未占用空间的约定。
我目前正在通过递归解决这个问题,但效率非常低。我想知道是否有更好的方法。我甚至会感谢参考。
修改1 :我对非重叠B
的最大数量感兴趣。
编辑2 :让A
成为以下数组:
让B
成为以下数组:
请注意,我将B
及其中心设为不同的颜色,仅供观看。
然后我可以通过以下两种方式将B
放入A
:
在第一张图片中,我能够容纳六个B
。然而,在第二张图片中,我能够适应九个。我对最大数量感兴趣。
答案 0 :(得分:0)
我能想到的最直接的方法是最坏情况 O(mnpq)。将矩阵B
视为位于矩阵A
之上的模板。对于x,y
中A
的每个位置,其中B
可以放置在该位置的左上角(x,y
),以便所有矩阵{{1} {}包含在B
内(这些位置有(mp)(nq)),检查每个A
和0<=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
将为您提供不发生碰撞的位置数。