我们只要按递增顺序搜索要求的n个数,然后跟前面的数判断距离是否大于d,在找到一组解后它肯定是最小的,输出。 数据不大,暴力搜索即可。
注意:
1. 0是必须出现的。
2. b给出了搜索的最大值:2^b-1
3. 计算两个数a,b的距离,只要计算a xor b的数的二进制形式中1的个数,非常方便。
/*
ID:xsy97051
PROB:hamming
LANG:C++
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,b,d,num[65],len=1;
int pan(int x,int y)
{
int ans=0,temp=x^y;
while(temp>0)
{
ans++;
temp=temp-(temp&(-temp));
}
return ans;
}
int main()
{
freopen("hamming.in","r",stdin);
freopen("hamming.out","w",stdout);
cin>>n>>b>>d; //n ge b wei d juli
num[1]=0;
for(int i=1;i<(1<<b);i++)
{
int flag=1;
for(int j=1;j<=len;j++)
if(pan(i,num[j])<d)
{
flag=0; 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;
}