C语言实现全排列(部分算法参考网友,可实现重复字符的组合)
2011-04-12 10:01
567 查看
# include <stdio.h> # include <string.h> char s[100]; int n = 0; int t = 0; int flage = 0;//描述两个数组是一样的 char Str[100][100]; //数据交换 void swap(char *a, char *b) { char m; m = *a; *a = *b; *b = m; } void circle_right(char a[],int m,int i) { char temp; int j,k; for(k=1;k<=i-m;k++) { temp=a[i]; for(j=i;j>m;j--) { a[j]=a[j-1]; } a[m]=temp; } } void circle_left(char a[],int m,int i) { char temp; int j,k; for(k=1;k<=i-m;k++) { temp=a[m]; for(j=m;j<i;j++) { a[j]=a[j+1]; } a[i]=temp; } } void perm(int k,char a[],int l) { int i; if(k == 1) { //将我们现在的组合复制进存储数组中,以备后面进行查询是否有重复 for(i = 0; i < l; i++) { Str[t][i] = s[i]; } t++; //这里进行比较 for(int s1 = 0; s1 < t-1; s1++)//这里比较是否有重复数组 { int eq = 1; for(int s2 = 0; s2 <= l; s2++)//这个用来比较两个数组是否一样 { if(Str[t-1][s2] != Str[s1][s2]) { eq = 0; } } if(eq == 1) flage = 1; } if(flage == 0) { for(i = 0; i < l; i++) printf("%c", s[i]); printf("/n"); n++; } else flage = 0; } for(i = 0; i < k; i++) { swap(&a[0], &a[i]); circle_right(a,1,i); perm(k-1,&a[1],l); circle_left(a,1,i); swap(&a[i], &a[0]); } } int main() { int l; gets(s); l=strlen(s); perm(l,s,l); printf("total:%d/n", n); return 0; }
相关文章推荐
- 含重复字符的字符串组合算法(深度优先搜索树递归实现)
- js实现字符全排列算法的简单方法
- 常见的字符串匹配算法对比实现C语言版本
- KMP字符串匹配算法及C语言实现
- c语言实现排列组合算法问题
- 比特币系统采用的公钥密码学方案和ECDSA签名算法介绍——第二部分:代码实现(C语言)
- 回溯字符串【C语言】朴素字符串匹配算法及其实现
- 算法学习(java实现之字符串篇)·····判断字符串是否没有重复字符
- 【面试算法系列】替换字符串中的空格为其他字符 - C语言实现
- c语言实现排列组合算法问题
- [算法学习]Java实现字符序列全组合
- C语言实现Huffman Tree(参考严蔚敏《数据结构》部分伪码)
- c语言实现排列组合算法问题
- 尾单词长度、1 3 9 27 81 实现1-121任意算法、去除重复字符并排序、拼音转数字、按要求分解字符串
- C语言去除相邻重复字符函数的实现方法
- [算法]字符串匹配算法之BM算法,C语言实现
- c语言中部分限制字符函数的实现strncmp,strncat,strncpy,strstr,strrstr
- 请用Java实现一个算法:由a-z、0-9组成3位的字符密码,并打印所有可能的密码组合。
- 全排列的算法与C语言实现
- 【C语言】朴素字符串匹配算法及其实现