从0开始构造相互之间异或后有D个1的数,有贪心思想 #include<iostream> #include<fstream> #include<string> #include<memory.h> #include<cstdio> #include<cmath> #include<algorithm> #include<queue> #include<vector> using namespace std; ifstream fin("hamming.in"); ofstream fout("hamming.out"); int N,B,D; int res[100],ri=0; const unsigned int m1=0x55555555; const unsigned int m2=0x33333333; const unsigned int m4=0x0f0f0f0f; const unsigned int m8=0x00ff00ff; const unsigned int m16=0x0000ffff; unsigned int solve(unsigned int a,unsigned int b){ unsigned int t=a^b; t=(t&m1)+((t>>1)&m1); t=(t&m2)+((t>>2)&m2); t=(t&m4)+((t>>4)&m4); t=(t&m8)+((t>>8)&m8); t=(t&m16)+((t>>16)&m16); return t; } int main(){ fin>>N>>B>>D; int t_max=(1<<(B+1)); res[ri++]=0; for(int i=1;i<t_max;i++){ if(ri==N) break; bool flag=true; for(int j=0;j<ri;j++){ if(solve(res[j],i)<D){ flag=false; } } if(flag) res[ri++]=i; } int cnt=0; for(int k=0;k<ri;k++){ fout<<res[k]; if(k==ri-1){ fout<<endl;break;} if(cnt==9){ fout<<endl; cnt=0; } else{ cnt++; fout<<" "; } } return 0; }