https://www.luogu.org/problemnew/show/P1461
// luogu-judger-enable-o2
#include<stdio.h>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<string>
#include<math.h>
#include<algorithm>
using namespace std;
int n, b, d;
int a[67];
int find(int x,int y)//返回x,y二进制不同位个数
{
int g=x^y;
int s=0;
while (g!=0)
{
if (g & 1) s++;//统计
g>>=1;
}
return s;
}
int p = 0;
int main()
{
cin>>n>>b>>d;
int m = (1<<b);
for(int i = 0; i <= m - n; i++)//定开头
{
bool tag = false;
a[p] = i;//定开头
p++;
for(int j = a[p - 1] + 1; j <= m - 1; j++)//枚举每个数字
{
if(find(j, a[p - 1]) >= d)//跟相邻的符合
{
int k;
for( k = 0; k < p; k++)//跟前p-1个比较是否符合
{
if(find(a[k], j) < d)
break;
}
if(k == p )//跟前面的比较符合
a[p++] = j;
}
if(p == n)//找完
{
tag = true;
break;
}
}
if(tag)//找完
break;
else
p = 0;//当前开头不符合,则i++
}
int htag = 0;//行控制
for(int i = 0; i < p; i++)
{
cout<<a[i]<<" ";
htag++;
if(htag == 10)
{
cout<<endl;
htag = 0;
}
}
//system("pause");
}