IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 力扣——835. 图像重叠(Java、JavaScript、C实现) -> 正文阅读

[数据结构与算法]力扣——835. 图像重叠(Java、JavaScript、C实现)

  1. 图像重叠
    给你两个图像 img1 和 img2 ,两个图像的大小都是 n x n ,用大小相同的二进制正方形矩阵表示。二进制矩阵仅由若干 0 和若干 1 组成。

转换 其中一个图像,将所有的 1 向左,右,上,或下滑动任何数量的单位;然后把它放在另一个图像的上面。该转换的 重叠 是指两个图像 都 具有 1 的位置的数目。

请注意,转换 不包括 向任何方向旋转。越过矩阵边界的 1 都将被清除。

最大可能的重叠数量是多少?

示例 1:

输入:img1 = [[1,1,0],[0,1,0],[0,1,0]], img2 = [[0,0,0],[0,1,1],[0,0,1]]
输出:3
解释:将 img1 向右移动 1 个单位,再向下移动 1 个单位。

两个图像都具有 1 的位置的数目是 3(用红色标识)。

示例 2:

输入:img1 = [[1]], img2 = [[1]]
输出:1
示例 3:

输入:img1 = [[0]], img2 = [[0]]
输出:0
在这里插入图片描述
在这里插入图片描述


Java代码:

class Solution {
    public int largestOverlap(int[][] A, int[][] B) {
        int n = A.length;
        int[][] count = new int[n * 2 - 1][n * 2 - 1];
        for (int i = 0; i < n; i ++)
            for (int j = 0; j < n; j ++)
                if (A[i][j] == 1)
                    for (int x = 0; x < n; x ++)
                        for (int y = 0; y < n; y ++)
                            if (B[x][y] == 1)
                                count[i - x + n - 1][j - y + n - 1] ++;
        int res = 0;
        for (int i = 0; i < n * 2 - 1; i ++)
            for (int j = 0; j < n * 2 - 1; j ++)
                res = Math.max(res, count[i][j]);
        return res;
    }
}

在这里插入图片描述


C代码:

#define DEBUG 0

#if DEBUG
#define dbg(fmt, ...) do { printf("[%s-%d]"fmt"\r\n", __FUNCTION__, __LINE__, ##__VA_ARGS__); } while (0)
#else
#define dbg(fmt, ...) do {} while (0)
#endif

int g_largestOverlap = 0;

int CalcOverlap(int** A, int ASize, int* AColSize, int** B, int BSize, int* BColSize, int x, int y)
{
    int i, j;
    int overlap = 0;
    
    for (i = 0; i < ASize; i++) {
        for (j = 0; j < AColSize[i]; j++) {
            if ((((i + y) >= 0) && ((i + y) < ASize)) && (((j + x) >= 0) && ((j + x) < ASize))) {
                dbg("i + x:%d, i + y:%d", i + x, i + y);
                overlap += (B[i][j] & A[i + y][j + x]);
            }
        }
    }
    
    return overlap;
}


void dfs(int** A, int ASize, int* AColSize, int** B, int BSize, int* BColSize, int **visited, int x, int y)
{
    int overlap;
    int d[][2] = {
        { 0,  1},
        { 0, -1},
        {-1,  0},
        { 1,  0}
    };
    int i;
    int xx, yy;

    overlap = CalcOverlap(A, ASize, AColSize, B, BSize, BColSize, x, y);
    dbg("x:%d, y:%d, overlap:%d", x, y, overlap);
    if (g_largestOverlap < overlap) {
        g_largestOverlap = overlap;
        dbg("g_largestOverlap:%d", g_largestOverlap);
    }
    
    for (i = 0; i < 4; i++) {
        xx = x + d[i][0];
        yy = y + d[i][1];
        
        if (((xx + ASize) >= 2 * ASize) || ((xx + ASize) <= 0) || 
            ((yy + ASize) >= 2 * ASize) || ((yy + ASize) <= 0)) {
            //dbg("xx:%d, yy:%d 2 * ASize:%d", xx, yy, 2 * ASize);
            continue;
        }
        
        //dbg("xx + ASize:%d, yy + ASize:%d", xx + ASize, yy + ASize);
        if (visited[yy + ASize][xx + ASize]) {
            continue;
        }
        visited[yy + ASize][xx + ASize] = 1;
        dfs(A, ASize, AColSize, B, BSize, BColSize, visited, xx, yy);
        //visited[xx + ASize][yy + ASize] = 0;
    }
    
    return;
}

int largestOverlap(int** A, int ASize, int* AColSize, int** B, int BSize, int* BColSize)
{
    int i;
    int **visited;
    
    g_largestOverlap = 0;

    visited = malloc(ASize * 2 * sizeof(int *));
    
    for (i = 0; i < ASize * 2; i++) {
        visited[i] = malloc(ASize * 2 * sizeof(int));
        memset(visited[i], 0, ASize * 2 * sizeof(int));
    }
    
    dfs(A, ASize, AColSize, B, BSize, BColSize, visited, 0, 0);
    
    return g_largestOverlap;
}

在这里插入图片描述


JavaScript代码:

/**
 * @param {number[][]} img1
 * @param {number[][]} img2
 * @return {number}
 */
var largestOverlap = function (img1, img2) {
  const len = img1.length
  const count = Array(2 * len + 1)
    .fill(0)
    .map(() => Array(2 * len + 1).fill(0))
  for (let i = 0; i < len; i++) {
    for (let j = 0; j < len; j++) {
      if (img1[i][j] === 1) {
        for (let i2 = 0; i2 < len; i2++) {
          for (let j2 = 0; j2 < len; j2++) {
            if (img2[i2][j2] === 1) {
              count[i - i2 + len][j - j2 + len] += 1
            }
          }
        }
      }
    }
  }

  let ans = 0
  for (const row of count) {
    ans = Math.max(...row, ans)
  }
  return ans
}

在这里插入图片描述


作者:KJ.JK
本文仅用于交流学习,未经作者允许,禁止转载,更勿做其他用途,违者必究。
文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-23 11:02:21  更:2022-04-23 11:03:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:21:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码