Исходник перебора функций, числа m и n вводятся с клавиатуры
Код на C++ #include <stdio.h> #include <conio.h> #include <alloc.h> //#define m 4 //#define n 2 long kol=0; int p(int *x, int k) //возвращает 1, если выполнены условия { int i,j; if (k==0) return 1; if (p(x,k-1)) //если среди предшествующих условие выполнено { if (!(x[k-1]>=x[k])) return 0; return 1; } else return 0; } void main(void) { int *b; //верхние границы раскрашенных подмножеств //b[m+1] закрашивает элементы последнего //множества A-i равны 0, 1, 2, ..., n int *x; //генерируемая последовательность int i, k,m,n; //k - длина последней сгенерированной FILE *in=fopen("fanc.txt","w"); do { printf("введите числа m и n для первого и второго множества\nтакие, что m>=n\n"); printf("число m "); scanf("%d",&m); printf("число n "); scanf("%d",&n); } while (m<n); b = (int *)calloc(m+2,sizeof(int)); x = (int *)calloc(m+1,sizeof(int)); for(i=0;i<=m;b[i]=-1,i++) b[m+1]=n; k=0; while(k>=0) { if(b[k]<n) { x[k]=++b[k]; if(p(x,k)) { if (k==m) { for (i=0;i<=k;i++) fprintf(in," %d",x[i]); fprintf(in,"\n"); kol++; } if(k<m) k++; } } else b[k--]=-1; } printf("%ld",kol); }
Результат работы - файл fanc.txt:
0 0 0 0 0 0
1 0 0 0 0 0
1 1 0 0 0 0
1 1 1 0 0 0
1 1 1 1 0 0
1 1 1 1 1 0
1 1 1 1 1 1
2 0 0 0 0 0
2 1 0 0 0 0
2 1 1 0 0 0
2 1 1 1 0 0
2 1 1 1 1 0
2 1 1 1 1 1
2 2 0 0 0 0
|