top1编程
← 返回题目
题解

图像相似度

1 条题解

  • 0
    @ 2026-8-5 1:04:44

    解题思路

    两张图都是 m 行 n 列的二维数组,我们只要在对应位置比较:

    如果第 1 张图的 a[i][j] 和第 2 张图的 b[i][j] 相等,就说明这个像素点一样,个数 same 加 1。

    相似度 = 相同像素点个数 ÷ 总像素数(总像素数 = m × n)。

    样例里相同像素点有 4 个,总像素 3×3=9 个,4 ÷ 9 ≈ 0.4444,保留两位小数就是 0.44。

    关于保留两位小数:直接用整数除法会丢掉小数部分,所以我们要先算“相似度 × 100”并四舍五入。 算式 h = (same * 200 + total) / (2 * total) 就是四舍五入到百分位的技巧(分子加半个 total 再整除), 最后输出整数部分 h / 100 和小数点,再输出小数部分 h % 100;小数部分不足两位时在前面补一个 0。

    参考代码

    // 图像相似度:两张图对应像素点相同的个数 ÷ 总像素数,四舍五入到小数点后两位
    #include <iostream>
    using namespace std;
    int a[1005][1005], b[1005][1005];
    int main() {
        int m, n;
        cin >> m >> n;
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++) cin >> a[i][j];   // 读入第一幅图
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++) cin >> b[i][j];   // 读入第二幅图
        int same = 0;
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
                if (a[i][j] == b[i][j]) same++;           // 对应像素相同就+1
        int total = m * n;
        int h = (same * 200 + total) / (2 * total);       // 四舍五入到百分位
        cout << h / 100 << ".";                           // 输出整数部分和小数点
        int t = h % 100;
        if (t < 10) cout << 0;                            // 不足两位补0
        cout << t << endl;
        return 0;
    }
    

    复杂度分析

    要读入并比较 m×n 个像素,两层循环,时间复杂度 O(m×n)。两个二维数组各占 m×n 个格子,空间复杂度 O(m×n)。

    • 1