深夜无人偷偷的水一下

给梁神跪了。。好吧把自己写的,贴出来,不过写的还真是丑,不够一定会好起来的。。

/*
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 ;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值