首页 > 试题广场 >

图像相似度

[编程题]图像相似度
  • 热度指数:18960 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
给出两幅相同大小的黑白图像(用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
#include <stdio.h>
#include <stdlib.h>

void init(int m, int n, int x[m][n]);

int main(void)
{
    int m, n;
    float percent;
    int i, j, count;
    
    scanf("%d %d", &m ,&n);
    int (*a)[n] = (int (*)[n])malloc(sizeof(int) * m * n);
    if (NULL == a)
    {
        fprintf(stderr, "Memory Allocation failed!\n");
        exit(EXIT_FAILURE);
    }
    int (*b)[n] = (int (*)[n])malloc(sizeof(int) * m * n);
    if (NULL == b)
    {
        fprintf(stderr, "Memory Allocation failed!\n");
        exit(EXIT_FAILURE);
    }
    init(m, n, a);
    init(m, n, b);
    for (i = 0, count = 0; i < m; i++)
    {
        for (j = 0; j < n; j++)
        {
            if (a[i][j] == b[i][j])
            {
                count++;
            }
        }
    }
    percent = (float)count / (m * n);
    printf("%.2f\n", percent * 100);
    
    return 0;
}

void init(int m, int n, int x[m][n])
{
    int i, j;
    
    for (i = 0; i < m; i++)
    {
        for (j = 0; j < n; j++)
        {
            scanf("%d", &x[i][j]);
        }
    }
    return;
}
//C语言使用malloc和变长数组即可;
//代码美观;
编辑于 2020-04-18 19:16:23 回复(2)
#include<stdio.h>
int main() {
    int arr[100][100] = {0};
    int input = 0, n, m, count = 0;
    scanf("%d %d", &n, &m);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++)
            scanf("%d", &arr[i][j]);
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            scanf("%d", &input);
            if (input == arr[i][j])
                count++;
        }
    }
    float ret = (1.0 * count / (n * m) * 1.0) * 100;
    printf("%.2f\n", ret);
    return 0;
}

发表于 2022-08-04 19:56:08 回复(0)
#include <stdio.h>

int main(){
    int n, m, arr[10][10];
    int x, count = 0;
    scanf("%d %d", &n, &m);
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++)
            scanf("%d", &arr[i][j]);
    }
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            scanf("%d", &x);
            if(x == arr[i][j])
                count++;
        }
    }
    printf("%.2f", (float)count / (n * m) * 100);
    return 0;
}

发表于 2022-06-08 20:59:02 回复(0)
#include <iostream>
using namespace std;

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

发表于 2022-02-28 21:14:18 回复(0)
求救!python运行2秒超时了,平时测试都可以,我寻思两层循环也不复杂啊。。。谢谢!
a = input().split()
b = []
while True:
    try:
        total = 0
        b.append(input().split())
    except:
        y,x = map(int,a)
        al = x * y
        for i in range(y,2*y):
            for j in range(x):
                if b[i][j] == b[i-y][j]:
                    total += 1
        t = total/al
        print("{:.2f}".format(t*100))
        if t:
            break

发表于 2021-03-21 10:58:46 回复(1)
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int m = scanner.nextInt();
        int n = scanner.nextInt();
        int[] array = new int[m*n];
        int similar = 0;
        int num = 0;
        for(int i=0;i<m*n;i++) {
            array[i] = scanner.nextInt();
        }
                //不必创建两个数组,另一个直接比较即可
        for(int i=0;i<m*n;i++) {
            num = scanner.nextInt();
            if(num==array[i]) {
                similar++;
            }
        }
        System.out.printf("%.2f",similar*1.0/(m*n)*100);
    }

发表于 2021-03-18 15:19:36 回复(0)
#include <iostream>
#include <iomanip>

using namespace std;
int pic1[10001];
int pic2[10001];
int main(){
    int a, b, c;
    double count = 0;
    cin >> a >> b;
    c = a * b;
    for(int t = 0; t < c; t++){
        cin >> pic1[t];
    }
    for(int t = 0; t < c; t++){
        cin >> pic2[t];
        count += pic2[t] == pic1[t] ? 1: 0;
    }
    cout << fixed << setprecision(2) << count * 100.00 / c;
    return 0;
}
题目要求是相似度,没必要开二维数组,直接初始化长度为长乘宽的一维数组即可,我们只需要把两个数组都比较一遍,然后统计出有多少相同的数字,最后计算出百分比,结束。
编辑于 2021-02-08 19:04:13 回复(2)
#include <cstdio>
int main(){
    int twoImage[210][110], m, n;
    float count = 0;
    scanf("%d %d", &m, &n);
    for(int i = 0; i < 2*m; i++)
        for(int j = 0; j < n; j++)
            scanf("%d", &twoImage[i][j]);
    for(int i = 0; i < m; i++)
        for(int j = 0; j < n; j++){
            if(twoImage[i][j] == twoImage[i+m][j]) count++;
        }
    printf("%.2f", 100*count/(m*n));
    return 0;
}

发表于 2020-04-18 15:17:19 回复(0)
借鉴别人用的二维数组,简单了不少。值得注意的是最后求百分比,不是像数学里的求法先除再乘以100%,而是先要乘以100.0再进行除法运算
#include <stdio.h>
int main()
{
  int m, n, i, j;
  scanf("%d %d", &m, &n);
  int arr1[100][100] = {0};
  int arr2[100][100] = {0};
  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++)
      scanf("%d ", &arr2[i][j]);
  int count = 0;
    for(i=0; i<m; i++)
       for(j=0; j<n; j++)
           if(arr1[i][j] == arr2[i][j])
               count++;
  float per = 100.0 * count / (m*n);
  printf("%.2f\n", per);
  return 0;
}

发表于 2022-01-09 21:50:47 回复(1)
想太多了,老想着一排一排的输入,然后写了循环嵌套。。。结果发现直接输就完事了
int main()
{
    int m,n,a[100],b[100],i,cnt=0;
    float per;
    while(~scanf("%d%d",&m,&n)){
        for(i=0;i<m*n;i++){
                scanf("%d",&a[i]);
        }
         for(i=0;i<m*n;i++){
                scanf("%d",&b[i]);
            }
        for(i=0;i<m*n;i++)
        {
            if(a[i]==b[i])
                cnt++;
        }
        printf("%.2f",per=cnt/(m*n*1.0)*100);
    }
    return 0;
}


发表于 2021-11-19 10:57:08 回复(6)
#include <stdio.h>

int main() {
     int m,n=0;
     scanf("%d %d",&m,&n);
     int arr1[100][100]={0};
     int arr2[100][100]={0};
    int i,j,count=0;
    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++)
        {
            scanf("%d",&arr2[i][j]);
        }
    }
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            if(arr1[i][j]==arr2[i][j])
            {
                count++;
            }
        }
    }
    printf("%.2f\n",100.0*count/(m*n));
    return 0;
}

编辑于 2024-01-17 21:36:21 回复(0)
#include <stdio.h>
int main()
{
    int n = 0,m = 0,count = 0;
    double percent = 0.;
    int arr[106][106] = {0};
    int arr2[106][106] = {0};
    scanf("%d%d",&n,&m);
    for(int i = 0;i<n;i++)
    {
        for(int j = 0;j<m;j++)
        {
            scanf("%d",&arr[i][j]);//输入
        }
    }
    for(int i = 0;i<n;i++)
    {
        for(int j = 0;j<m;j++)
        {
            scanf("%d",&arr2[i][j]);//输入
        }
    }
    for(int i = 0;i<n;i++)
    {
        for(int j = 0;j<m;j++)
        {
            if(arr[i][j]==arr2[i][j])//记录相同
                count++;
        }
    }
    percent = (double)count/(n*m)*100;//计算百分比
    printf("%.2lf",percent);
    return 0;
}

发表于 2023-03-18 09:35:05 回复(0)
m,n=map(int,input().split())
a=[]
b=[]
for i in range(m):
    a.append(list(map(int,input().split())))
for i in range(m):
    b.append(list(map(int,input().split())))
x=0
for i in range(m):
    for j in range(n):
        if a[i][j]==b[i][j]:
            x=x+1
print('{:.2f}'.format((x*100)/(m*n)))

发表于 2022-06-07 19:48:22 回复(0)
#include <stdio.h>

int main() {
    int a, b;
    scanf("%d %d",&a , &b);
    int arr1[100][100];
    int arr2[100][100];
    int count=0;
    for (int i=0; i<a; i++) {
        for (int j=0; j<b; j++) {
            scanf("%d ",&arr1[i][j]);
        }
    }
     for (int i=0; i<a; i++) {
        for (int j=0; j<b; j++) {
            scanf("%d ",&arr2[i][j]);
            if (arr2[i][j]==arr1[i][j]) {
                count++;            
            }
        }
    }
    float ret;
    ret=(float) (count*100)/(a*b);
    printf("%.2f",ret);

    return 0;
}

编辑于 2024-04-11 16:38:27 回复(0)
#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <malloc.h>

int main()
{
    int row = 0;
    int col = 0;
    int* one = NULL;
    int* two = NULL;
    int i = 0;
    int j = 0;
    float same = 0.0f;

    scanf("%d%d", &row, &col);

    //开辟空间,存放2和图像
    one = (int*)malloc(sizeof(int) * row * col);
    if (!one)
    {
        perror("malloc:one");
        return 1;
    }
    two = (int*)malloc(sizeof(int) * row * col);
    if (!two)
    {
        perror("malloc:two");
        return 1;
    }

    //录入图像1
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            scanf("%d", one + (i * col) + j);
        }
    }
    //录入图像2
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            scanf("%d", two + (i * col) + j);
        }
    }

    //比对2个图像差异
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            if (*(one + (i * col) + j) == *(two + (i * col) + j))
            {
                same++;
            }
        }
    }
    same = same / (row * col) * 100;//输出的是百分之,故*100

    printf("%.2f\n", same);

    //释放内存
    free(one);
    free(two);
    one = NULL;
    two = NULL;

    return 0;
}

编辑于 2024-03-19 15:22:09 回复(0)
#include<stdio.h> 
 int main()
{
	int n, m;
	scanf("%d %d",&n,&m);

	int hs[1000][1000];
	int ls[1000][1000];

	int p = 0;

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			scanf("%d", &hs[i][j]);
		}
	}

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			scanf("%d", &ls[i][j]);
		}
	}


	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			if (hs[i][j] != ls[i][j])
			{
				p++;
			}
		}
	} 

	float s = (1 - (float)p / (n * m)) * 100;
	printf("%.2f", s);
	return 0;
}

编辑于 2024-03-11 21:47:26 回复(0)
逐一比较
m,n= map(int,input().split())
a = []
b = []

for i in range(m):
    a.append(list(map(int,input().split())))
for j in range(m):
    b.append(list(map(int,input().split())))

c=0
for i in range(m):
    for j in range(n):
        if a[i][j]==b[i][j]:
            c += 1

print("{:.2f}".format(100*c/(m*n)))


编辑于 2024-02-09 16:26:39 回复(0)
#include <stdio.h>

int main() {
    int m, n;
    scanf("%d %d", &m, &n);
    int arr_1[m][n], arr_2[m][n];
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d", &arr_1[i][j]);
        }
    }
    int tag = 0;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d", &arr_2[i][j]);
            if(arr_1[i][j] == arr_2[i][j]){
                tag++;
            }
        }
    }
    printf("%.2f", (float)tag*100/(m*n));
    return 0;
}

编辑于 2024-02-05 10:48:43 回复(0)
package main

import (
    "fmt"
)

func main() {
    var n,m int
    fmt.Scan(&n,&m)
    arr := [100][100]int{}

    for i:=0;i<n;i++{
        for j:=0;j<m;j++{
            fmt.Scan(&arr[i][j])
        }
    }

    var x,s int
    for i:=0;i<n;i++{
        for j:=0;j<n;j++{
            fmt.Scan(&x)
            if x == arr[i][j] {
                s ++
            }
        }
    }

    fmt.Printf("%.2f", float64(s*100)/float64(n*m))
}
发表于 2023-12-25 21:42:22 回复(0)
#include <stdio.h>

int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    int arr[100][100];
    int arr1[100][100];
    double sum = 0;
    for(int i = 0;i<n;i++)
    {
        for(int j = 0;j<m;j++)
        {
            scanf("%d",&arr[i][j]);

        }
    }
    for(int i = 0;i<n;i++)
    {
        for(int j = 0;j<m;j++)
        {
            scanf("%d",&arr1[i][j]);
            if(arr1[i][j]==arr[i][j])
            sum++;
        }
    }
    printf("%.2lf",sum/(n*m)*100);
    return 0;
}

发表于 2023-11-27 16:44:42 回复(0)

问题信息

上传者:牛客309119号
难度:
88条回答 3307浏览

热门推荐

通过挑战的用户

查看代码