您的位置:首页 > 其它

usaco Hamming Codes

2016-11-07 16:12 246 查看
就是在二进制上的枚举,B位的意思就是十进制不超过1<<B,数字很小枚举即可每枚举一个跟前面的进行比较看符不符合题意,就是进行按位异或然后统计其中1的个数大于等于D就符合题意。

/*
ID:jinbo wu
LANG: C++
TASK: hamming
*/
#include<bits/stdc++.h>
using namespace std;
int a[500];
int n,b,d,maxn;
bool check(int m,int k)
{
int temp=m^k;
int cnt=0;
while(temp)
{
if(temp&1) cnt++;
temp>>=1;
}
if(cnt>=d)
return true;
return false;
}
bool can(int m,int k)
{
for(int i=1;i<k;i++)
{
if(!check(m,a[i]))
return false;
}
return true;
}
void dfs(int cnt,int m)
{
if(cnt==n)
{
a[cnt]=m;
return;
}
a[cnt]=m;
for(int i=m+1;i<=maxn;i++)
{
if(can(i,cnt+1))
{
dfs(cnt+1,i);
break;
}
}
}
int main()
{
freopen("hamming.in","r",stdin);
freopen("hamming.out","w",stdout);
scanf("%d %d %d",&n,&b,&d);
maxn=1<<b;
dfs(1,0);
int l=1;
int temp=n;
while(temp)
{
for(int i=1;i<min(temp,10);i++)
{
printf("%d ",a[l++]);
}
printf("%d\n",a[l++]);
temp-=min(temp,10);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: