给梁神跪了。。好吧把自己写的,贴出来,不过写的还真是丑,不够一定会好起来的。。
/*
ID:qi he
PROG: hamming
LANG: C
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//#define bit_count[(x)^(y)] hamming((x),(y))
void Travel(int i);
void Push(int i);
void Pop(void);
int judge(int i);
static int bit_count[256] =
{0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,
3,3,4,2,3,3,4,3,4,4,5,1,2,2,3,2,3,3,4,2,
3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,
5,5,6,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,
3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,2,3,3,4,3,
4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,
5,5,6,5,6,6,7,1,2,2,3,2,3,3,4,2,3,3,4,3,
4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,2,
3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,
5,5,6,4,5,5,6,5,6,6,7,2,3,3,4,3,4,4,5,3,
4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,
6,6,7,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,
5,5,6,5,6,6,7,5,6,6,7,6,7,7,8
};
int ans[256];
int map[300][300];
int NUM=0,N,B,D,range,yes=0;
int main(void)
{
int i,j;
FILE *fin=fopen("hamming.in","r");
FILE *fout=fopen("hamming.out","w");
fscanf(fin,"%d%d%d",&N,&B,&D);
range=1<<B;
for(i=0;i<range;i++)
for(j=0;j<range;j++)
if(i==j)
map[i][j]=1;
else
map[i][j]= bit_count[i^j] >=D?1:0;
Travel(0);
//sort();
// fprintf(fout,"%d\n",range);
//for(i=121;i<=127;i++)
// fprintf(fout,"judge :%d\n",judge(i));
for(i=0;i<N;i++)
if(i%10==9||i==N-1)
fprintf(fout,"%d\n",ans[i]);
else
fprintf(fout,"%d ",ans[i]);
return 0;
}
int judge(int i)
{
int j;
for(j=0;j<NUM;j++)
if(!map[i][ans[j]])
return 0;
return 1;
}
void Push(int i)
{
ans[NUM]=i;
NUM++;
}
void Pop(void)
{
NUM--;
}
void Travel(int i)
{
//fprintf(fout,"%d\n",i);
int k;
if(NUM==N){
yes=1;
return;
}
if(judge(i)&&NUM<N)
Push(i);
for(k=1;i+k<=range;k++)
{
Travel(i+k);
if(yes) break;
}
if(!yes) Pop();
return ;
}