HDU 4712 Hamming Distance (随机算法)

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\n",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\n",MIN);
    }
    return 0;
}
View Code

 

 

 

posted @ 2013-09-10 11:09  执着追求的IT小小鸟  阅读(196)  评论(0编辑  收藏  举报