风回小院庭芜绿,柳眼春相续
回复 21楼 纳兰伽香
我想了半天也没找到好的算法只有从网上找别人现成的代码
稍做整理 放在这里 仅供参考
程序代码:
#include <stdio.h> #include <stdlib.h> void prt_num(int *num, int n) { int i; for(i = 0; i < n; i++) if(num[i]) putchar(i + 'a'); printf(" "); } int check(int *num, int n, int m) { int i, flag = 0; for(i = 0; i < n - m; i++) if(num[i]) flag = 1; return flag; } void comb_num(int *num, int n, int m) { int i, j, count; prt_num(num, n); for(;;) { count = 0; for(i = 0; i < n - 1; i++) { if(num[i] == 1 && num[i + 1] == 0) { num[i] = 0; num[i + 1] = 1; break; } if(num[i]) count++; } for(j = 0; j < i; j++) { if(j < count) num[j] = 1; else num[j] = 0; } prt_num(num, n); if(!check(num, n, m)) break; } } int main(void) { int n, m, *num, i; if((scanf("%d %d", &n, &m)) != 2 || m <= 0 || n <= m) return 1; if(!(num = malloc(sizeof(int) * n))) return 1; for(i = 0; i < n; i++) { if(i < m) num[i] = 1; else num[i] = 0; } comb_num(num, n, m); puts(""); return 0; }