uva10098 - Generating Fast(快速生成有序排列)
还是题意理解不清,导致wa了2次,
题意理解了就好做了,几乎是照抄课本上的代码, 没意思:!
方法一:
生成可重集的排列:
代码如下:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; char s[15]; void printf_permutation(int n, char *flag, int cur) { if(n==cur) { for(int i = 0; i < n; i++) printf("%c",flag[i]); printf("\n"); return; } for(int i = 0; i < n; i++)if(!i||s[i]!=s[i-1]) { int c1 = 0, c2 = 0; for(int j = 0; j < cur; j++) if(flag[j]==s[i])c1++; for(int j = 0; j < n; j++) if(s[j]==s[i])c2++; if(c1<c2) { flag[cur] = s[i]; printf_permutation(n, flag, cur+1); } } } int main () { int t; char flag[15]; scanf("%d",&t); while(t--) { scanf("%s",s); memset(flag, 0, sizeof(flag)); int len = strlen(s); sort(s,s+len); printf_permutation(len, flag, 0); puts(""); } return 0; }方法二:
利用STL中的库函数-next_permutation()
代码如下:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int main () { int n; char p[15]; scanf("%d",&n); while(n--) { scanf("%s",p); int len = strlen(p); sort(p,p+len); do { printf("%s\n",p); } while(next_permutation(p,p+len)); puts(""); } return 0; }