next_permutation的思想和用法

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
	int a[4]={1,2,3,4};
	do{
		cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<" "<<a[3]<<endl;
	}
	while(next_permutation(a,a+4));
	system("pause");


}
该段代码意思为求1,2,3,4的全排列。

next_permutation(a,a+4)
即求括号中内容的下一个排列。如:a[4]={1,2,3,4}.next_permutation(a,a+4) 即为1,2,4,3.

函数原型:

若为4,3,2,1.next_permutation的返回值即为false,因为没有下一个排列。但是经过一次函数调用之后会变为1,2,3,4.


与之相对的还有一个函数为prev_permutation()  顾名思义,该函数为求上一个排列。


百度百科中的解释如下:

next_permutation函数将按字母表顺序生成给定序列的下一个较大的排列,直到整个序列为降序为止。prev_permutation函数与之相反,是生成给定序列的上一个较小的排列。二者原理相同,仅遍例顺序相反



问题:如何求一个数组的下一个排列?


假设该数组为3 6 4 2.下一个排列应为 4 2 3 6.

过程:对于一个任意序列,最小的排列是增序,最大的为减序。

从最后一位向前看,首先得到的是2,单纯的一个数不需要进行交换。

然后得到的是 4 2,4大于2,在这个子序列中已经为最大序列,无法排出更大的序列了。

然后得到的是 6 4 2,原理同上。

之后得到的是 3 6 4 2,此时由于3小于6且小于4,而 3 6 4 2的下一个排列应为比3 6 4 2这个排列大的排列中最小的那个,所以3应该和4进行交换,此时该排列变为 4 6 3 2.此时4位于首端,所以之后的序列应为最小序列,即 2 3 6.综上,最终结果应为 4 2 3 6.



使用到该函数的例题:

2015-蓝桥杯-3题:


code:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
    int a[10];
    for(int i = 0; i <= 9; i++)
    {
            a[i] = i;
    }
    do
    {
        if(!a[2] || !a[6])
                continue;
        int x = a[2] * 1000 + a[3] * 100 + a[4] * 10 + a[5];
        int y = a[6] * 1000 + a[7] * 100 + a[8] * 10 + a[3];
        int z = a[6] * 10000 + a[7] * 1000 + a[4] * 100 + a[3] * 10 + a[9];
        if(x + y == z)
            cout <<y<<endl;    
    }while(next_permutation(a, a + 10));
    return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值