图形相似度(C++)

题目描述
给出两幅相同大小的黑白图像(用0-1矩阵)表示,求它们的相似度。

说明:若两幅图像在相同位置上的像素点颜色相同,则称它们在该位置具有相同的像素点。两幅图像的相似度定义为相同像素点数占总像素点数的百分比。

输入格式
第一行包含两个整数m和n,表示图像的行数和列数,中间用单个空格隔开1≤m≤100,1≤n≤100。

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

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

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

img

那就是循环遍历统计相同数据个数,最后除以总像素点数就可以了
代码:

#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
    int m, n;
    int p1[101][101], p2[101][101];
    cin >> m >> n;
    
    //输出第一幅图
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cin >> p1[i][j];
        }
        
    }
    //输出第2幅图
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cin >> p2[i][j];
        }

    }
    int nmb = 0;
    //对比
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (p1[i][j] == p2[i][j])
                nmb++;
        }
    }
    //计算比例
    double ps = 100.0 * nmb / (m * n);
    cout << fixed << setprecision(2) << ps;
    return 0;
}

#include <iostream>
#include <iomanip>
using namespace std;
const int N = 110;
int a[N][N], b[N][N];
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 cnt = 0;
    for (int i = 0; i < m; i ++ )
        for (int j = 0; j < n; j ++ )
            if (a[i][j] == b[i][j])
                cnt ++ ;

    double res = cnt * 100.0 / (m * n);
    cout << fixed << setprecision(2) << res;
    return 0;
}
#include <iostream>
using namespace std;

int main()
{
    int m, n;
    cin >> m >> n;

    int same_pixels = 0;
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            int pixel1, pixel2;
            cin >> pixel1;
            cin >> pixel2;
            if (pixel1 == pixel2)
            {
                same_pixels++;
            }
        }
    }

    double similarity = (double)same_pixels / (m * n) * 100;
    printf("%.2f", similarity);

    return 0;
}

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/959708
  • 除此之外, 这篇博客: C与C++程序设计学习笔记中的 5、某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。每位选手都有一个起步的分数为10分。某获胜选手最终得分刚好是100分,如果不让你看比赛过程,你能推断出他(她)哪个题目答对了,哪个题目答错了吗?如果把答对的记为1,答错的记为0,则10个题目的回答情况可以用仅含有1和0的字符串来表示。例如:0010110011 就是可能的情况。你的任务是算出所有可能情况。每个答案占一行。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #include <stdio.h>
    int ti[11] = { 0 }; //用来存储每道题的回答情况0或者1,0表示错误,1表示正确
    //提醒:数组ti的编号实际用1-10
    //score表示当前得分,num是当前第num道题目
    void f(int score, int num)
    {
    	if (num == 11)//10道题目全部做完
    	{
    		if (score == 100)
    		{
    			int i = 0;
    			for (i = 1; i <= 10; i++)
    				printf("%d", ti[i]);
    			printf("\n");
    		}
    	}
    	else //10道题目没有做完
    	{
    		ti[num] = 1; //讨论第num道题目的正确情况
    		f(score * 2, num + 1);
    		ti[num] = 0; //讨论第num道题目的错误情况
    		f(score - num, num + 1);
    	}
    }
    int main(void)
    {
    	f(10, 1);//从基础分10分开始,从第1题开始
    	return 0;
    }
    

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632