还是用的两种方法,递归和STL,递归那个是含有反复元素的全排列,这道题我 没有尝试没有反复元素的排列,由于从题目上并没有发现一定是有反复元素的()
贴代码:
<span style="font-family:Courier New;font-size:18px;">#include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> using namespace std; int cmp(const void *a,const void *b) { return *(char *)a - *(char *)b; } int main() { int T; char a[15]; scanf("%d",&T); while(T--) { scanf("%s",a); int len = strlen(a); qsort(a,len,sizeof(a[0]),cmp); puts(a); while(next_permutation(a,a+len)) { puts(a); } puts(""); } return 0; } </span>
递归:
<span style="font-family:Courier New;font-size:18px;">#include<stdio.h> #include<string.h> #include<stdlib.h> int cmp(const void *a,const void *b) { return *(char *)a - *(char *)b; } void solve(int len,char *a,char *b,int cur) { int i,j; if(cur == len) { puts(b); return ; } else { for(i=0; i<len; i++) { if(!i||(a[i] != a[i-1])) { int ans1 = 0, ans2 = 0; for(j=0; j<len; j++) if(a[i] == a[j]) ans1++; for(j=0; j<cur; j++) if(b[j]==a[i]) ans2++; if(ans2 < ans1) { b[cur] = a[i]; solve(len, a, b, cur+1); } } } } return ; } int main() { int T; char a[15]; char b[15]; scanf("%d",&T); while(T--) { memset(a,'\0',sizeof(a)); memset(b,'\0',sizeof(b)); scanf("%s",a); int len = strlen(a); qsort(a,len,sizeof(a[0]),cmp); solve(len,a,b,0); puts(""); } return 0; } </span>
时间: 2024-12-17 22:03:51