xcoj 1065 图像匹配


1065: 图像匹配

时间限制: 1 Sec   内存限制: 32 MB
提交: 28   解决: 15

题目描述

 x申请了一个创新项目,内容是进行相似图像匹配。他的实现方法是这样的:

1、 建立一个相当大的图像库,里面存放数以万计的图片,每张图片使用一个字符串命名(如A1000.bmp),字符串的长度小于或等于20字符(如A1000.bmp9字符)。

2、 为每一张图片生成一个Hash值,这个Hash值由3601字符串构成(如000011011101001001100001110000100111)。

3、 给出一张陌生的图片,计算它的Hash值。

4、 根据上步计算出的Hash值,比较查找图片库中与这张图片最相似的一张或几张图片。

现在小x需要你帮助他来完成第4步,即小x给出图片名和Hash值,由你在图片库中查找一张或几张最相似的图片,输出图片名、相似度。

相似度这样计算:36 - 两个Hash值的汉明距离,相似度越大,两张图片越接近。

汉明距离这样计算:两个等长字符创之间的汉明距离是两个字符串对应位置的字符不同的个数,如1000001001之间的汉明距离是31000010001之间的汉明距离是1

输入

 多组测试数据 ,对于每组数据:

第一行为一个整数N,表示图像库中的图片数目(0 < N <= 10000)

接下来N行,每行为图片名和对应的36Hash值,图片名和Hash值之间由一个空格隔开。

N+2行为一个整数Q,表示接下来要匹配的图片数目(0 < Q <= 100)

接下来Q行,每行为待匹配的图片名和对应的36Hash值,图片名和Hash值之间由一个空格隔开

输出

 对于每组数据:

对于每张待匹配的图片,第一行输出一个整数X,表示图片库中有X张图片与它最相似。

第二行输出一个整数,是图片的相似度。

接下来X行,每行输出一张图片的名称。

注意当有多张图片可以匹配时,按输入中图片给出的顺序排列

样例输入

5Image1000.bmp 101110001011011101010000101010011010Image1001.bmp 001011001010110110010100011010101000Image1002.bmp 101001011100101011011100101010110110Image1003.bmp 100011100001101101111101010010101000Image1004.bmp 0010010111001010110111001010101101112Image1005.bmp 101011001010110110010100011010101000Image1006.bmp 101001011100101011011100101010110111

样例输出

135Image1001.bmp235Image1002.bmpImage1004.bmp





题目链接:http://xcacm.hfut.edu.cn/problem.php?id=1065




竟然是水题




//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<string>
#include<sstream>
#include<cstdlib>
#include<cstring>
#include<cctype>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<deque>
#include<cmath>
#include<climits>
#include<list>
#include<utility>
#include<memory>
#include<cstddef>
#include<iterator>
#include<iomanip>

using namespace std;
typedef long long LL;
typedef long double LD;
const double PI = acos(-1.0);
///
int judge(char *a, char *b) {
	int res = 36;
	int len = 36;
	for (int i = 0; i < len; i++) {
		if (a[i] != b[i]) {
			res--;
		}
	}
	return res;
}

struct inf {
	char name[36];
	char hash[36];
};

///
int main(int argc, char**argv) {
	ios_base::sync_with_stdio(0); cin.tie(0);
	//freopen("input.txt", "r", stdin);?
	//freopen("output.txt", "w", stdout);
	

	int m;
	scanf("%d", &m);
	struct inf st[10007];

	for (int i = 1; i <= m; i++) {
		scanf("%s%s", st[i].name, st[i].hash);
	}
	int n;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		char c[36], d[36];
		scanf("%s%s", c, d);
		int sc[10003];
		int max = -1;
		for (int j = 1; j <= m; j++) {
			sc[j] = judge(d, st[j].hash);
			if (max < sc[j]) {
				max = sc[j];
			}
		}
		int num = 0;
		for (int j = 1; j <= m; j++) {
			if (sc[j] == max) num++;
		}
		printf("%d\n", num);
		printf("%d\n", max);
		for (int j = 1; j <= m; j++) {
			if (sc[j] == max) {
				printf("%s\n", st[j].name);
			}
		}
	}

	
	//system("pause");
	return 0;
}

//END





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值