Brute force + backtracking /* coder: ACboy date: 2010-3-19 result: 1A description: UVa 729 The Hamming Distance Problem */ #include <iostream> using namespace std; // 用于保存所有生产的结果 char data[13000][20]; // 用来保存每次生产的组合数的结果。 int temp[20]; int c= 0; int H, N; int cmp(const void * a, const void * b) { char * pa = (char *)a; char * pb = (char *)b; return strcmp(pa, pb); } // 回溯生产所有的组合数并保存到data中。 void dfs(int pos) { if (pos == H) { for (int j = 0; j < H; j++) { data[c][temp[j] - 1] = '1'; } for (int k = 0; k < N; k++) { if (data[c][k] != '1') { data[c][k] = '0'; } } data[c][N] = '/0'; c++; } else { for (int i = N; i >= 1; i--) { if (pos == 0 || i < temp[pos - 1]) { temp[pos] = i; dfs(pos + 1); } } } } int main() { int k; #ifndef ONLINE_JUDGE freopen("729.txt", "r", stdin); #endif cin >> k; while (k--) { cin >> N >> H; c = 0; dfs(0); // 对保存的结果进行排序。 qsort(data, c, sizeof(char [20]), cmp); // 输出结果 for (int i = 0; i < c; i++) { cout << data[i] << endl; } memset(data, -1, sizeof(data)); if (k) cout << endl; } return 0; }