Translation
给出 N,B 和 D,要求找出 N 个由 0 或 1 组成的编码(1 <= N <= 64),每个编码有 B 位(1 <= B <= 8),使得两两编码之间至少有 D 个单位的“Hamming 距离”(1 <= D <= 7)。“Hamming 距离”是指对于两个编码,他们二进制表示法中的不同二进制位的数目。看下面的两个编码 0x554 和 0x234(0x554 和 0x234 分别表示两个十六进制数)
0x554 = 0101 0101 0100
0x234 = 0010 0011 0100
不同位 xxx xx
因为有五个位不同,所以“Hamming 距离”是 5。
PROGRAM NAME: hamming
INPUT FORMAT:(file hamming.in)
一行,包括 N, B, D。
OUTPUT FORMAT:(file hamming.out)
N 个编码(用十进制表示),要排序,十个一行。如果有多解,你的程序要输出这样的解:假如把它化为 2^B 进制数,它的值要最小。
Solution
这道题也没什么好说的,注意第一个肯定是0;题目翻译的最后一句的意思无非就是输出最小的解,什么2^B进制数管都没管。
Code
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int maxn=64+10;
int ans[maxn],p;
int check(int x,int y){
int dis=0,tmp;
tmp=x^y;
while(tmp>=1){
if(tmp%2){
dis++;
tmp-=1;
}
else tmp/=2;
}
if(dis>=p)return 1;
else return 0;
}
int main(){
int i,j,k,m,n;
freopen("hamming.in","r",stdin);
freopen("hamming.out","w",stdout);
scanf("%d%d%d",&n,&m,&p);
ans[1]=0;
k=1;
for(i=1;;i++){
int flag=0;
if(k==n)break;
for(j=1;j<=k;j++)
if(!check(i,ans[j])){
flag=1;
break;
}
if(!flag)ans[++k]=i;
}
for(i=1;i<n;i++)
if(i%10==0)printf("%d\n",ans[i]);
else printf("%d ",ans[i]);
printf("%d\n",ans[n]);
return 0;
}