next_permutation函数总结

本文详细介绍了next_permutation函数的功能及使用方法,包括如何通过此函数遍历整数、字符和字符串类型的全排列,展示了不同数据类型的具体实现案例。

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

next_permutation函数总结

这是一个求一个排序的下一个排列的函数,可以遍历全排列
头文件: include<algorithm>
与之完全相反的函数还有 prev_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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值