H.图像匹配(安徽省2014年“京胜杯”大学生程序设计竞赛)
2015-05-01 11:46
246 查看
Description
小x申请了一个创新项目,内容是进行相似图像匹配。他的实现方法是这样的:
1、 建立一个相当大的图像库,里面存放数以万计的图片,每张图片使用一个字符串命名(如A1000.bmp),字符串的长度小于或等于20字符(如A1000.bmp为9字符)。
2、 为每一张图片生成一个Hash值,这个Hash值由36位01字符串构成(如000011011101001001100001110000100111)。
3、 给出一张陌生的图片,计算它的Hash值。
4、 根据上步计算出的Hash值,比较查找图片库中与这张图片最相似的一张或几张图片。
现在小x需要你帮助他来完成第4步,即小x给出图片名和Hash值,由你在图片库中查找一张或几张最相似的图片,输出图片名、相似度。
相似度这样计算:36 - 两个Hash值的汉明距离,相似度越大,两张图片越接近。
汉明距离这样计算:两个等长字符创之间的汉明距离是两个字符串对应位置的字符不同的个数,如10000和01001之间的汉明距离是3,10000和10001之间的汉明距离是1。
Input
第一行为一个整数N,表示图像库中的图片数目(0 < N <= 10000)
接下来N行,每行为图片名和对应的36位Hash值,图片名和Hash值之间由一个空格隔开。
第N+2行为一个整数Q,表示接下来要匹配的图片数目(0 < Q <= 100)
接下来Q行,每行为待匹配的图片名和对应的36位Hash值,图片名和Hash值之间由一个空格隔开。
Output
对于每张待匹配的图片,第一行输出一个整数X,表示图片库中有X张图片与它最相似。
第二行输出一个整数,是图片的相似度。
接下来X行,每行输出一张图片的名称。
注意当有多张图片可以匹配时,按输入中图片给出的顺序排列。
Sample Input
5
Image1000.bmp 101110001011011101010000101010011010
Image1001.bmp 001011001010110110010100011010101000
Image1002.bmp 101001011100101011011100101010110110
Image1003.bmp 100011100001101101111101010010101000
Image1004.bmp 001001011100101011011100101010110111
2
Image1005.bmp 101011001010110110010100011010101000
Image1006.bmp 101001011100101011011100101010110111
Sample Output
1
35
Image1001.bmp
2
35
Image1002.bmp
Image1004.bmp
自己的解法
#include<iostream>//交流qq:591498086,邮件dengyong666666@gmail.com
#include<string>
#include<cstring>
using namespace std;
int main(void)
{struct picture
{string hash;
string name;
int jl;
};
int size1;
picture *p=new picture [size1];
for(int i=0;i<size1;i++)
{cin>>p[i].name>>p[i].hash;}
int size2;
cin>>size2;
picture *b=new picture [size2];
int c=0;
int xts=0;
for(int i=0;i<size2;i++)
{cin>>b[i].name>>b[i].hash;}
for(int i=0;i<size2;i++)
{for(int z=0;z<size1;z++)
{
for(int j=0;j<36;j++)
if(b[i].hash[j]!=p[z].hash[j])
p[i].jl=p[i].jl+1;
}
for(int m=0;m<size1;m++)
{
if(p[m].jl<p[m+1].jl)
{
c=p[m].jl;
}
else
{
c=p[m+1].jl;
}
}
for(int i=0; i<size1;i++)
{if(p[i].jl==c)
xts++;
}
cout<<xts<<endl;
cout<<36-c<<endl;
for(int i=0;i<size1;i++)
{if(p[i].jl==c)
cout<<p[i].name<<endl;}
}
return 0;
}
小x申请了一个创新项目,内容是进行相似图像匹配。他的实现方法是这样的:
1、 建立一个相当大的图像库,里面存放数以万计的图片,每张图片使用一个字符串命名(如A1000.bmp),字符串的长度小于或等于20字符(如A1000.bmp为9字符)。
2、 为每一张图片生成一个Hash值,这个Hash值由36位01字符串构成(如000011011101001001100001110000100111)。
3、 给出一张陌生的图片,计算它的Hash值。
4、 根据上步计算出的Hash值,比较查找图片库中与这张图片最相似的一张或几张图片。
现在小x需要你帮助他来完成第4步,即小x给出图片名和Hash值,由你在图片库中查找一张或几张最相似的图片,输出图片名、相似度。
相似度这样计算:36 - 两个Hash值的汉明距离,相似度越大,两张图片越接近。
汉明距离这样计算:两个等长字符创之间的汉明距离是两个字符串对应位置的字符不同的个数,如10000和01001之间的汉明距离是3,10000和10001之间的汉明距离是1。
Input
第一行为一个整数N,表示图像库中的图片数目(0 < N <= 10000)
接下来N行,每行为图片名和对应的36位Hash值,图片名和Hash值之间由一个空格隔开。
第N+2行为一个整数Q,表示接下来要匹配的图片数目(0 < Q <= 100)
接下来Q行,每行为待匹配的图片名和对应的36位Hash值,图片名和Hash值之间由一个空格隔开。
Output
对于每张待匹配的图片,第一行输出一个整数X,表示图片库中有X张图片与它最相似。
第二行输出一个整数,是图片的相似度。
接下来X行,每行输出一张图片的名称。
注意当有多张图片可以匹配时,按输入中图片给出的顺序排列。
Sample Input
5
Image1000.bmp 101110001011011101010000101010011010
Image1001.bmp 001011001010110110010100011010101000
Image1002.bmp 101001011100101011011100101010110110
Image1003.bmp 100011100001101101111101010010101000
Image1004.bmp 001001011100101011011100101010110111
2
Image1005.bmp 101011001010110110010100011010101000
Image1006.bmp 101001011100101011011100101010110111
Sample Output
1
35
Image1001.bmp
2
35
Image1002.bmp
Image1004.bmp
自己的解法
#include<iostream>//交流qq:591498086,邮件dengyong666666@gmail.com
#include<string>
#include<cstring>
using namespace std;
int main(void)
{struct picture
{string hash;
string name;
int jl;
};
int size1;
picture *p=new picture [size1];
for(int i=0;i<size1;i++)
{cin>>p[i].name>>p[i].hash;}
int size2;
cin>>size2;
picture *b=new picture [size2];
int c=0;
int xts=0;
for(int i=0;i<size2;i++)
{cin>>b[i].name>>b[i].hash;}
for(int i=0;i<size2;i++)
{for(int z=0;z<size1;z++)
{
for(int j=0;j<36;j++)
if(b[i].hash[j]!=p[z].hash[j])
p[i].jl=p[i].jl+1;
}
for(int m=0;m<size1;m++)
{
if(p[m].jl<p[m+1].jl)
{
c=p[m].jl;
}
else
{
c=p[m+1].jl;
}
}
for(int i=0; i<size1;i++)
{if(p[i].jl==c)
xts++;
}
cout<<xts<<endl;
cout<<36-c<<endl;
for(int i=0;i<size1;i++)
{if(p[i].jl==c)
cout<<p[i].name<<endl;}
}
return 0;
}
相关文章推荐
- SDUT 2879 Colorful Cupcakes (2014年山东省第五届ACM大学生程序设计竞赛)
- 多连块拼图 (湖南省第七届大学生计算机程序设计竞赛真题) (平移+模拟匹配)
- angry_birds_again_and_again(2014年山东省第五届ACM大学生程序设计竞赛A题)
- 2014年第七届河南省ACM大学生程序设计竞赛有感
- 2014年山东省第五届ACM大学生程序设计竞赛 E. Factorial
- 2014年山东省第五届ACM大学生程序设计竞赛解题报告
- 2014年第五届福建省大学生程序设计竞赛省赛6题题解
- 2014年山东省第五届ACM大学生程序设计竞赛-B-Circle
- “亚信科技杯”南邮第七届大学生程序设计竞赛之网络预赛 A noj 2073 FFF [ 二分图最大权匹配 || 最大费用最大流 ]
- CSU Problem 1809 Parenthesis(括号匹配,线段树,前缀和)——湖南省第十二届大学生计算机程序设计竞赛
- 2014年山东省第五届ACM大学生程序设计竞赛--Hearthstone II(第二类Stirling数)
- 河南省第九届大学生程序设计竞赛(未完待续)
- HDU-计算机学院大学生程序设计竞赛(2015’11)1003 玩骰子(枚举)
- fzu 2278 YYS [第八届福建省大学生程序设计竞赛 Problem G] [概率]
- fzu 2277 Change [第八届福建省大学生程序设计竞赛 Problem F] [线段树]
- CSU 1335: 高桥和低桥(树状数组啊 二分查找啊 湖南省第九届大学生计算机程序设计竞赛)
- 第八届福建省大学生程序设计竞赛 L.Tic-Tac-Toe【思维+暴力枚举】
- ZZUOJ-1194-ARM立即数寻址 (郑州大学第七届ACM大学生程序设计竞赛正式赛F题)
- FZU2272+Frog+签到题+第八届福建省大学生程序设计竞赛
- 安徽省2016“京胜杯”程序设计大赛_I_恶魔A+B