您的位置:首页 > 其它

USACO2.1.5 Hamming Codes (hamming)

2015-01-27 19:54 337 查看
我们只要按递增顺序搜索要求的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: