[USACO][Section 2.1][枚举] Hamming Codes

题目大意:

给出 N、B、D,要求找出 N 个由0或1组成的编码(1 <= N <= 64),每个编码有 B 位(1 <= B <= 8),使得两两编码之间至少有 D 个单位的“Hamming距离”(1 <= D <= 7)。“Hamming距离”是指对于两个编码,他们二进制表示法中的不同二进制位的数目。

思路:

从0开始从小到大暴力枚举,每个数都与其他已确定的数进行比较,若比较结果全部符合“Hamming距离”不小于B,则存储进arry[]内。如此反复,直至找出N个数为止。

代码:

/*
ID: lujunda1
LANG: C++
PROG: hamming
*/
#include
#include
using namespace std;
int N,B,D;
int sum,arry[300];
int dif(int a,int b)
//求出a、b之间的“Hamming距离”。 
{
    int s=0;
    for(int i=0;i>i)%2-(b>>i)%2)
            s++;
    return s;
}
void check(int n)
//对于n,将其与其它已确定的数进行比较,检查其“Hamming距离”是否都不小于D。 
{
    for(int i=0;i<sum;i++)
        if(dif(n,arry[i])<D)
            return;
    arry[sum++]=n;
    //符合条件的情况下,将n记录在arry[]中。 
}
int main()
{
    freopen("hamming.in","r",stdin);
    freopen("hamming.out","w",stdout);
    scanf("%d%d%d",&N,&B,&D);
    sum=0;
    for(int i=0;sum!=N;i++)
        check(i);
    for(int i=0;i<N;i++)
        if(i==N-1||(i+1)%10==0)
        //注意题目要求每行10个数。 
            printf("%d\n",arry[i]);
        else
            printf("%d ",arry[i]);
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注