列表

详情


BC135. 图像相似度

描述

给出两幅相同大小的黑白图像(用0-1矩阵)表示,求它们的相似度。若两幅图像在相同位置上的像素点颜色相同,则称它们在该位置具有相同的像素点。两幅图像的相似度定义为相同像素点数占总像素点数的百分比。

输入描述

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

输出描述

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

示例1

输入:

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

输出:

44.44

原站题解

C 解法, 执行用时: 1ms, 内存消耗: 348KB, 提交时间: 2021-01-23

#include<stdio.h>
int main()
{
	int m, n;
	int a[100][100], b[100][100];
	scanf("%d %d", &m, &n);
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
		{
			scanf("%d", &a[i][j]);
		}
	}
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
		{
			scanf("%d", &b[i][j]);
		}
	}
	int c = m * n;
	float k=0, sum;
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (a[i][j]==b[i][j])
			{
				k++;
			}
		}
	}
	sum = (k / c)*100.0;
	printf("%.2f", sum);
	return 0;
}

C 解法, 执行用时: 1ms, 内存消耗: 364KB, 提交时间: 2021-06-15

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int main()
{
    //输入
    int m, n;//行列
    int sum = 0;//总像素点
    int count = 0;//相同像素点
    scanf("%d %d", &m, &n);
    sum = m * n;

    int* a = (int*)malloc(sizeof(int)*m*n);//开拓2个n*m的空间
    int* a1 = (int*)malloc(sizeof(int)*m*n);//开拓2个n*m的空间
    assert(a);
    assert(a1);
    
    int i = 0;
    //接收第一个图每行每列的元素
    for(i = 0; i < m*n; i++)
    {
        scanf("%d ", &a[i]);
    }
    //接收第二个图每行每列的元素
    for(i = 0; i < m*n; i++)
    {
        scanf("%d ", &a1[i]);
        //求相同像素点
        if(a[i] == a1[i])
            count++;
    }
    //输出
    printf("%.2f\n", count/(sum*1.0) * 100);
    return 0;
}

C++14 解法, 执行用时: 1ms, 内存消耗: 364KB, 提交时间: 2020-07-10

#include<stdio.h>
int main()
{
	int m,n;
	scanf("%d %d",&m,&n);
	int a[m][n],b[m][n];
	int i,j;
	for(i=0;i<m;i++)
	{
		for(j=0;j<n;j++)
		{
			scanf("%d",&a[i][j]);
		}
	}
	for(i=0;i<m;i++)
	{
		for(j=0;j<n;j++)
		{
			scanf("%d",&b[i][j]);
		}
	}
	int sum;
	for(i=0,sum=0;i<m;i++)
	{
		for(j=0;j<n;j++)
		{
			if(a[i][j]==b[i][j])
			{
				sum++;
			}
		}
	}
	printf("%.2lf",(100.0*sum)/(m*n));
}

C 解法, 执行用时: 1ms, 内存消耗: 364KB, 提交时间: 2020-06-06

#include <stdio.h>
int main()
{
    int n,m,i,j,a[100][100],b[100][100];
    float count1,count2,sum;
    scanf("%d %d",&m,&n);
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            scanf("%d",&b[i][j]);
        }
    }
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            count1++;
            if(a[i][j] == b[i][j])
            {
                count2++;
            }
        }
    }
    sum = (count2/count1)*100;
    printf("%.2f",sum);
    return 0;
}

C 解法, 执行用时: 1ms, 内存消耗: 368KB, 提交时间: 2021-04-26

#include<stdio.h>
int main(){
    int m,n,i,j,a = 0;
    scanf("%d %d",&m,&n);
    int arr[m][n],arr1[m][n];
    for(i = 0; i < m;i++){
        for(j = 0;j < n;j++){
            scanf("%d", &arr[i][j]);
        }
    }for(i = 0; i < m;i++){
        for( j = 0;j < n;j++){
            scanf("%d", &arr1[i][j]);
        }
    }for(i = 0;i < m;i++){
        for( j = 0;j < n;j++){
            if(arr[i][j] == arr1[i][j]){
                a++;
            }
        }
    }float b = (a*100.00)/(m * n);
    printf("%.2f",b);
    return 0;
}

上一题