zoukankan      html  css  js  c++  java
  • USACO2.15 Hamming Codes

    题意:

    给出 N,B 和 D:找出 N 个编码(1 <= N <= 64),每个编码有 B 位[二进制](1 <= B <= 8),使得两两编码之间至少有 D 个单位的“海明距离”(1 <= D <= 7)。“海明距离”是指对于两个编码,他们二进制表示法中的不同二进制位的数目。看下面的两个编码 0x554 和 0x234 之间的区别(0x554 表示一个十六进制数,每个位上分别是 5,5,4):

    0x554 = 0101 0101 0100
    0x234 = 0010 0011 0100
    不同位    xxx  xx
    

    因为有五个位不同,所以“海明距离”是 5。

    分析:直接暴力搜索,注意到一点,0 是一定会出现的,接着,直接从小到大(1--255)直接与已经生成的比较,若满足,则加入结果中。

    计算“海明距离”的时候,只需将计算a^b的值中1的个数即可。

    /*
    ID: nanke691
    LANG: C++
    TASK: hamming
    */
    #include <iostream>
    #include <fstream>
    using namespace std;
    int n,b,d;
    int distan(int x,int y)
    {
    	int w=x^y;
    	int m=0;
    	for(int i=0;i<b;i++)
    		if((w&(1<<i))!=0)
    			m++;
    	return m;
    }
    int main()
    {
        int num[65],len=1;
    	freopen("hamming.in","r",stdin);
    	freopen("hamming.out","w",stdout);
        cin>>n>>b>>d;
        num[1]=0;
        for (int i=1;i<(1<<b);i++)
        {
            bool flag=true;
            for (int j=1;j<=len;j++)
                if (distan(i,num[j])<d)
                {
                       flag=false;
                       break;
                }
            if (flag) 
            {
                      len++;
                      num[len]=i;
            }
            if (len==n) break;
        }
        for (int i=1;i<=len;i++)
        {
            cout<<num[i];
            if ((i%10==0)||(i==len)) cout<<endl;
            else cout<<" ";
        }
        return 0;
    }
    
  • 相关阅读:
    -_-#【H5】meta / href
    -_-#【CSS3】CSS3 gradient transition with background-position
    ♫【jQuery】detach
    -_-#setTimeout与setInterval
    -_-#【Mac】MacVim
    -_-#【jQuery】data
    ♫【Backbone】this
    -_-#【Better JS Code】严格模式
    ♫【Node】module.filename / __filename / __dirname / process.cwd() / require.main.filename
    【图片处理】ImageMagick, gm
  • 原文地址:https://www.cnblogs.com/nanke/p/2225955.html
Copyright © 2011-2022 走看看