求集合的幂集
2012-11-06 16:03
155 查看
/* 求集合的幂集 */ #include <stdio.h> #include <stdlib.h> #define SET_LEN 5 typedef struct { char *elem; int card; } set; typedef struct { int *stat; int n; } fsm; double fac(int n) { if (n == 0 || n == 1) return 1; return n * fac(n-1); } double comb(int n, int k) { return fac(n)/(fac(k)*fac(n-k)); } void init_set(set *s, char *elem, int card) { s->elem = elem; s->card = card; } void init_fsm(fsm *s, int n) { s->stat = (int *)malloc(sizeof(int)*n); s->n = n; for (int i = 0; i < n; i++) s->stat[i] = i; } void print_stat(set *s, fsm *m) { for (int i = 0; i < m->n; i++) printf("%c", s->elem[m->stat[i]]); puts(""); } void mv(fsm *m) { int *r = &(m->stat[m->n-1]); (*r)++; } int update_which(set *s, fsm *m) { int t = s->card - 1; for (int i = m->n-1; i >= 0; i--) { if (m->stat[i] != t) return i; t--; } return 0; } void update(set *s, fsm *m) { int t = update_which(s, m); int *u = &(m->stat[t]); (*u)++; for (int i = *u+1, j = t+1; j < m->n; i++, j++) m->stat[j] = i; } void trans_stat(set *s, fsm *m) { int *r = &(m->stat[m->n-1]); int t = s->card - 1; if (*r != t) mv(m); else update(s, m); } void print_subset(set *s, fsm *m) { for (int i = 0; i < comb(s->card, m->n); i++) { print_stat(s, m); trans_stat(s, m); } } void print_powset(set *s) { puts("{}"); for (int i = 1; i <= s->card; i++) { fsm *m = (fsm *)malloc(sizeof(fsm)); init_fsm(m, i); print_subset(s, m); free(m); } } int main() { char e[] = "abcde"; set *s = (set *)malloc(sizeof(set)); init_set(s, e, SET_LEN); print_powset(s); return 0; }
相关文章推荐
- 求含n个元素的集合的幂集
- c++求集合幂集 源代码及算法优化
- 集合的幂集
- 回溯法之求n个集合的幂集
- 巧用二叉树原理求解集合的幂集
- 集合的幂集(C++)
- 解 :求有n个 元素的集合的幂集
- C语言 集合运算 并、交,相对补,对称差,判断两个集合是否相等,求集合幂集
- C语言获取集合幂集
- 求集合的幂集【转】
- 二进制方法 解 集合的幂集
- javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题
- 回溯法学习---求集合的幂集
- 非递归求集合的幂集
- 怎么计算一个集合的幂集(所有子集形成的集合)的长度?涉及组合数学基础
- C语言 集合运算 并、交,相对补,对称差,判断两个集合是否相等,求集合幂集(改进幂集)
- C++ 递归艺术----求任意集合的幂集组合和子集合的总个数
- 集合幂集
- 关于集合幂集问题的递归算法
- C语言 回溯的应用 ---- 输出集合{1,2,...n}的幂集