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;
}



posted on 2013-02-15 13:59  Primo...  阅读(150)  评论(0)    收藏  举报