UVA - 10098 - Generating Fast(全排列)

本文详细介绍了如何使用next_permutation函数高效解决UVA-10098全排列问题,包括int、char及string类型的示例代码,并提供了完整的AC代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UVA - 10098 - Generating Fast(全排列)

Generating permutation has always been an important problem in computer science. In this problem you will have to generate the permutation of a given string in ascending order. Remember that your algorithm must be efficient.

Input

The first line of the input contains an integer n, which indicates how many strings to follow. The next n lines contain n strings. Strings will only contain alpha numerals and never contain any space. The maximum length of the string is 10.

Output

For each input string print all the permutations possible in ascending order. Not that the strings should be treated, as case sensitive strings and no permutation should be repeated. A blank line should follow each output set.

Sample Input

3
ab
abc
bca

Sample Output

ab
ba

abc
acb
bac
bca
cab
cba

abc
acb
bac
bca
cab
cba


题意:给出一串字符串,要求按字典序从小到大输出字符串的全排列

偷下懒,用 next_permutation 可以很好解决,具体操作过程是先将字符串中的所有字符按字典序排序,调用那个函数就好,下面总结一下 next_permutation的用法


next_permutation函数总结

int类型

int main()
{
    int a[3];
    a[0]=1; a[1]=2; a[2]=3;
    do{
        printf("%d%d%d\n", a[0], a[i], a[2]);
    }while (next_permutation(a,a+3));
    //如果存在a之后的排列,就返回true。如果a是最后一个排列没有后继,返回false,每执行一次,a就变成它的后继
}

输出:

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

如果改成 while(next_permutation(a,a+2));
输出:

1 2 3
2 1 3

只对前两个元素进行字典排序

显然,如果改成 while(next_permutation(a,a+1)); 则只输出:1 2 3

若排列本来就是最大的了没有后继,则next_permutation执行后,会对排列进行字典升序排序,相当于循环

int list[3]={3,2,1};
next_permutation(list,list+3);
printf("%d %d %d\n", list[0], list[1], list[2]);

//输出: 1 2 3

char类型

int main()
{
    char str[205];
    scanf("%s", str);

    int len = strlen(str);
    sort(str, str+len);
    //该语句对输入的数组进行字典升序排序。如输入9874563102 puts(str); 将输出0123456789,这样就能输出全排列了

    do {
        puts(str);
    }while(next_permutation(str, str+len));

    return 0;
}

若采用 while(next_permutation(str, str+5)); 如果只输入1562,就会产生错误,因为str中第五个元素指向未知
若要整个字符串进行排序,参数5指的是数组的长度,不含结束符

string类型

int main()
{
    string line;
    while(cin>>line && line!="#")
    {
        if(next_permutation(line.begin(), line.end())) //从当前输入位置开始
            cout<<line<<endl;
        else    cout<<"Nosuccesor\n";
    }
}



int main()
{
    string line;
    while(cin>>line && line!="#")
    {
        sort(line.begin(), line.end());//全排列
        cout<<line<<endl;
        while(next_permutation(line.begin(), line.end()))
            cout<<line<<endl;
    }
}

以下是这道题的AC代码,用while 和 do-while 都OK,就是注意用while的时候记得把第一个输出来


#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int main()
{
    char str[15];
    int n;
    scanf("%d", &n);
    getchar();
    while(n--){
        gets(str);
        int len = strlen(str);
        sort(str, str+len);
        puts(str);
        while(next_permutation(str, str+len)){
            puts(str);
        }
        printf("\n");
    }
    return 0;   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值