Была у меня такая задачка на одной из контрольных. Написал рекурсией, но легко переделать и без её использования По научному задача состоит в том, что нужно перебрать в лексеграфическом порядке все подмножества данного множества из n элементов(у меня в проге считается, что все элементы-натуральные числа в диапозоне 1..n)
| Код | #include <stdio.h>
int n; // количество элементов bool* s; // типа говорит, участвует i-ый елемент в данном подмножестве или нет
void step(int k = -1) { // выводим очередное подмножество for (int i = 0; i < n; i++) { if (s[i]) printf("%i", i + 1); } // каждое подмножество на одной строке )) if (k != -1) printf("\n"); // генерируем следущеее подмножество for (i = k + 1; i < n; i++) { s[i] = true; step(i); s[i] = false; } }
int main() {
freopen("subset.in", "r", stdin); freopen("subset.out", "w", stdout); scanf("%i", &n); s = new bool[n];
// выводим пустое подмножество(если не надо удали) printf("\n");
int l = -1; step();
delete[] s; fclose(stdin); fclose(stdout); return 0; }
|
Если чтобы работало быстрее, то не выводи очередное подмножество, а сливай его в буфер, а потом одним разом выводи буфер и избавься от рекурсии |