标签:
题目很简单,找出N个二进制下长度为B的,且两两之间二进制位上至少有D位不同
暴力枚举就好了
/*
ID: modengd1
PROG: hamming
LANG: C++
*/
#include <iostream>
#include <stdio.h>
#include <memory.h>
using namespace std;
int sta[64];
bool slove(int sta[64],int N,int B,int D,int deep)
{
if(deep==N)
{
bool isbegin=true;
for(int i=0;i<N;i++)
{
if(isbegin)
{
cout<<sta[i];
isbegin=false;
}
else
cout<<‘ ‘<<sta[i];
if((i%10)==9)//每十个数字换行
{
isbegin=true;
cout<<endl;
}
}
if((N%10))//检查是否需要在最后一行输出换行
cout<<endl;
return true;
}
for(int i=0;i<(1<<B);i++)
{
bool allOk=true;
sta[deep]=i;
for(int j=0;j<deep;j++)
{
int dif=i^sta[j];
int counter=0;
while(dif>0)
{
dif-=dif&-dif;
counter++;
}
if(counter<D)//汉明距离小于D就break
{
allOk=false;
break;
}
}
if(allOk&&slove(sta,N,B,D,deep+1))//和前面得到的数的汉明距离都足够的话再枚举下一个
return true;
}
return false;
}
int main()
{
freopen("hamming.in","r",stdin);
freopen("hamming.out","w",stdout);
int N,B,D;
int sta[64];
scanf("%d%d%d",&N,&B,&D);
slove(sta,N,B,D,0);
return 0;
}
标签:
原文地址:http://www.cnblogs.com/modengdubai/p/4780097.html