1382: 【作】【入门】图像相似度?

内存限制:16 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:45 解决:16

题目描述

给出两幅相同大小的黑白图像(用0-1矩阵,0代表白色,1代表黑色)表示,求它们的相似度。
说明:若两幅图像在相同位置上的像素点颜色的值相同,则称它们在该位置具有相同的像素点。两幅图像的相似度定义为相同像素点数占总像素点数的百分比。
比如:输入
2 2
1 0
0 1
1 1
1 1
数据解释:第一行的2 2表示图像的尺寸是2行,每行2个整数;接下来的两行数据1 0和0 1表示第一幅图片的数值,再接下来两行数据1 1和1 1表示第二幅图片的数值;从数据上可以看出,两幅图片有2个数是相等的,因此两幅图片的相似度为50%,实际输出不需要输出百分号,结果保留2位小数,因此实际输出50.00。

输入

第一行包含两个整数n和m,表示图像的行数和列数,中间用单个空格隔开。1 <= n <= 100,1 <= m <= 100。
之后n行,每行m个整数0或1,表示第一幅黑白图像上各像素点的颜色。相邻两个数之间用单个空格隔开。
之后n行,每行m个整数0或1,表示第二幅黑白图像上各像素点的颜色。相邻两个数之间用单个空格隔开。

输出

一个小数,表示相似度(以百分比的形式给出,但百分号不需要显式),精确到小数点后两位。

样例输入 复制

3 3
1 0 1
0 0 1
1 1 0
1 1 0
0 0 1
0 0 1

样例输出 复制

44.44

提示

#include <bits/stdc++.h>

using namespace std;
int main() {
    /*
    思路:统计两个二维数组在同一个位置上的点相同值的个数占总点个数的百分比
    */
    int a[110][110], b[110][110], n, m, i, j, c = 0;
    cin >> n >> m;
    //读入第一幅图像的值 
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            cin >> a[i][j];
        }
    }
    //读入第二幅图像的值 
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            cin >> b[i][j];
        }
    }
    //统计相同点的个数
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            if (a[i][j] == b[i][j]) {
                c++;
            }
        }
    }
    double r = c * 100.0 / (n * m);
    cout << fixed << setprecision(2) << r << endl;
    return 0;
}