http://acm.hdu.edu.cn/showproblem.php?pid=4712
所谓的hamming distance就是the Hamming distance is equal to the number of ones in a XOR b. For calculating
Hamming distance between two strings a and b, they must have equal length. 两个长度相同的码字,其相对应的位可能不同,彼此不同位的个数称海明 距离。
应该最长也就20为,所以可以先把所有位数组合的结果先打表出来,然后再随机取数进行判断,在不超时的基础上,次数越高,过的概率越高
#include<stdio.h> #include<stdlib.h> #include<string.h> /*srand((int)time(NULL));设定随机数种子 rand()%100;产生0-99的随机数。高级点的,假如要产生x ~y之间的数,你可以这样写:rand()%(y-x+1)+x。*/ /*产生随机数*/ #include<time.h> int num[21][21]; int RandNum(int a,int b)/*返回a-b之间的随机数,a>=b*/ { return rand()%(b-a+1)+a; } void pre()//打表写出所有的可能 { int i,j,sum,aa[22],bb[22],k,n; for(i=0;i<16;i++) for(k=0;k<16;k++) { sum=0; n=i; j=3; while(n) { aa[j--]=n%2; n/=2; } while(j>=0) aa[j--]=0; n=k; j=3; while(n) { bb[j--]=n%2; n/=2; } while(j>=0) bb[j--]=0; for(j=0;j<4;j++) if(aa[j]!=bb[j]) sum++; num[i][k]=sum; } /*for(i=1;i<6;i++) printf("%5d%5d==%5d ",i,6-i,num[i][6-i]);*/ } int hamming(char *a,char *b) { int aa,bb; int i,j,len,sum=0; i=j=0; for(i=0;i<5;i++) { if(a[i]>='0'&&a[i]<='9') aa=a[i]-'0'; else aa=a[i]-'A'+10; if(b[i]>='0'&&b[i]<='9') bb=b[i]-'0'; else bb=b[i]-'A'+10; sum+=num[aa][bb]; } return sum; } int main() { int a,b,i,t,n,MIN,x; char s[100010][5],c[20]; pre(); srand((int)time(NULL));/*先设定随机种子*/ scanf("%d",&t); while(t--) { scanf("%d",&n); gets(c); for(i=1;i<=n;i++) { scanf("%s",s[i]); //printf("%s",s[i]); } MIN=21; for(i=0;i<900000;i++) { a=b=RandNum(1,n); while(b==a) b=RandNum(1,n); x=hamming(s[a],s[b]); if(x<MIN)MIN=x; } printf("%d ",MIN); } return 0; }