这题理解题意之后就是一简单的dfs,是每一个都相差不小于d。
       首先选取一个起始点,然后对于这个点进行dfs寻找,当找到了或者不可能找到时返回,中间的相差不小于d可以把两个数换成二进制然后再比较不同的位置。实现也不算难
      官方的如下,官方的就是先求出每两个数的二进制的位差,以免后面再重复求
    

官方
 1There are only a few tools we need to solve this problem. First of all, we can use basic techniques to find the Nth bit of a number M: counting the least significant bit as bit 0, the next bit as bit 1, etc., we can find the value of that bit through the expression 
 2
 3          int Nth_bit = (1 << N) & M;
 4
 5In other words, we are shifting the number 1 left by N spaces, and then performing a binary AND on the resulting number with our original number, which will leave either a 1 in the Nth bit or a 0. So the first thing we have to do is find out the distance between each pair of numbers within the set of all numbers with B bits (0..2B-1). 
 6We also know that 0 can be one of the numbers in the set, because if the minimum number in the set were N instead of 0, we could subtract N from each number in the set and they would still be the same distance apart. The limits on the problem are low enough that we can do a DFS, and as soon as we hit a solution we can output it and exit. 
 7
 8#include <stdio.h>
 9#include <stdlib.h>
10#include <iostream.h>
11#define MAX (1 << 8 + 1)
12#define NMAX 65
13#define BMAX 10
14#define DMAX 10
15
16int nums[NMAX], dist[MAX][MAX];
17int N, B, D, maxval;
18FILE *in*out;
19
20void findgroups(int cur, int start) {
21    int a, b, canuse;
22    char ch;
23    if (cur == N) {
24        for (a = 0; a < cur; a++{
25            if (a % 10)
26                fprintf(out" ");
27            fprintf(out"%d", nums[a]);
28            if (a % 10 == 9 || a == cur-1)
29                fprintf(out"\n");
30        }

31        exit(0);
32    }

33    for (a = start; a < maxval; a++{
34        canuse = 1;
35        for (b = 0; b < cur; b++)
36            if (dist[nums[b]][a] < D) {
37                canuse = 0;
38                break;
39            }

40        if (canuse) {
41            nums[cur] = a;
42            findgroups(cur+1, a+1);
43        }

44    }

45}

46
47int main() {
48    in = fopen("hamming.in""r");
49    out = fopen("hamming.out""w");
50    int a, b, c;
51    fscanf(in"%d%d%d"&N, &B, &D);
52    maxval = (1 << B);
53    for (a = 0; a < maxval; a++)
54        for (b = 0; b < maxval; b++{
55            dist[a][b] = 0;
56            for (c = 0; c < B; c++
57                if (((1 << c) & a) != ((1 << c) & b))
58                    dist[a][b]++;
59        }

60    nums[0= 0;
61    findgroups(11);
62    return 0;
63}

64
65