题目描述
给出两个图像 A
和 B
,A
和 B
为大小相同的二维正方形矩阵。(并且为二进制矩阵,只包含0和1)。
我们转换其中一个图像,向左,右,上,或下滑动任何数量的单位,并把它放在另一个图像的上面。之后,该转换的重叠是指两个图像都具有 1 的位置的数目。
(请注意,转换不包括向任何方向旋转。)
最大可能的重叠是什么?
示例 1:
输入:A = [[1,1,0], [0,1,0], [0,1,0]] B = [[0,0,0], [0,1,1], [0,0,1]] 输出:3 解释: 将 A 向右移动一个单位,然后向下移动一个单位。
注意:
1 <= A.length = A[0].length = B.length = B[0].length <= 30
0 <= A[i][j], B[i][j] <= 1
解题思路
矩阵A四个方向的移动可以抽象成:A中[0][0]点相对于B中[0][0]点的偏移量
int largestOverlap(vector<vector<int>>& A, vector<vector<int>>& B) {
int len = A.size(),ans = 0;
for(int ini=1-len;ini<len;ini++){
for(int inj=1-len;inj<len;inj++){
int tmp = 0;
for(int i=0;i<len;i++){
for(int j=0;j<len;j++){
if(i+ini>=0 && i+ini<len && j+inj>=0 && j+inj<len){
if(A[i][j] == 1 && B[i+ini][j+inj] == 1) tmp++;
}
}
}
ans = max(ans,tmp);
}
}
return ans;