/* 指定长度的字符串排列问题 Time : 2012 4 4 20:22 Author : C */ #include<stdio.h> #include<string.h> #include<stdlib.h> #define max 100 static char s[max],c[max],t[max][max],a[max]; static int length,judge,number=0,j=0,count=0; static bool v[max]; void DelDouble(); void DFS(char *s,int len); int main(); void print() { puts(" ●●●●●● "); puts(" ●全排列问题● "); puts(" ●●●●●● "); puts("请输入字符串:"); scanf("%s",s); puts("请选择是否剔除重复字符?"); puts("1: 剔除重复字符"); puts("2: 不剔除重复字符"); scanf("%d",&judge); if(judge == 1) DelDouble(); else strcpy(c,s); judge = 0; for(int i=0;c[i]!='\0';i++) v[i]=0; puts("处理后字符串:"); puts(c); puts("请输入排列长度:"); scanf("%d",&length); if(length > strlen(c)){ puts("输入有误 请重新输入 :"); memset(c,0,sizeof(c)); memset(s,0,sizeof(s)); main(); } puts("排列组合情况:"); DFS(c,length); } void out() { char tt[max][max]; int n=0,x; for(int i=0;i<count;i++) { for(x=0;x<n;x++) if(strcmp(tt[x],t[i])==0) break; if(x==n) strcpy(tt[n++],t[i]); } for(int i=0;i<n;i++) printf("%s\t",tt[i]); } void DelDouble() { int i,j,count=0; for(i=0;s[i]!='\0';i++) if(strchr(c,s[i])==NULL) c[count++]=s[i]; c[count]='\0'; } void DFS(char *s,int k) /*求全排列 组合*/ { int i; if(j!=length) { for(i=0;i<strlen(s);i++) if(v[i]==0) { v[i]=1; a[j]=s[i]; j++; DFS(s,k+1); v[i]=0; } }else{ a[j]='\0'; strcpy(t[count],a); count++; } j--; } int main() { print(); out(); }