next_permutation(排列组合)函数的用法

来源:互联网 发布:仿淘宝手机站 编辑:程序博客网 时间:2024/06/07 10:06

关于该函数的用法,不妨先看下这道题

题目描述

 一天ZJ看到小明竟然排序学的比自己还牛,于是就出了一道题来难为小明,来证明自己排序学的比小明更牛。题目就是有一个数n(0<n<10),写出1到n的全排列,这时小明有点囧了,,,聪明的你能帮小明解围吗?

输入

 第一行输入一个数N(0<N<10),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个整数x(0<x<10)

输出

 按特定顺序输出所有组合。
特定顺序:每一个组合中的值从小到大排列,组合之间按字典序排列。

样例输入

2
2
3

样例输出

12
21
123
132
213
231
312
321

代码如下

#include <iostream>
#include <algorithm>
usingnamespace std;
 
intmain()
{
intn,i,b;
cin>>b;
while(b--)
{
 cin>>n;
 inta[n];
 for(i=0;i<n;i++)
    a[i]=i+1;
do
{
    for(i=0;i<n;i++)
        cout<<a[i];
    cout<<endl;
}
while(next_permutation(a,a+n));//排列组合函数
}
return0;
}
在这里,不能用
while(next_permutation(a,a+n));//排列组合函数
{
    for(i=0;i<n;i++)
        cout<<a[i];
    cout<<endl;

}
这样只执行了一次;即:如果你输入3,输出结果是 123;
是不是觉得这个函数很容易那,那好,我们看下一题


小明十分聪明,而且十分擅长排列计算。比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想为难他,在这5个数字中选出几个数字让他继续全排列,那么你就错了,他同样的很擅长。现在需要你写一个程序来验证擅长排列的小明到底对不对。

输入

 第一行输入整数N(1<N<10)表示多少组测试数据,
每组测试数据第一行两个整数 n m (1<n<9,0<m<=n)

输出

在1-n中选取m个字符进行全排列,按字典序全部输出,每种排列占一行,每组数据间不需分界。如样例

样例输入

3
3 1
4 2
3 3

样例输出

1
2
3
12
13
14
21
23
24
31
32
34
41
42
43
123
132
213
231
312
321

代码如下

#include <iostream>
#include <algorithm>
#include <string>
#include <algorithm>
using namespace std;
 
int main()
{
int m,n,i,b;
cin>>b;
while(b--)
{
 string a,s1,s2;
 cin>>n>>m;
 for(i=0;i<n;i++)
    a+=i+'1';
 s1=a.substr(0,m);
    cout<<s1<<endl;
next_permutation(a.begin(),a.end());//先给s2一个初值
do
{
    s2=a.substr(0,m);
    if(s1!=s2)
       {
           cout<<s2<<endl;
           s1=s2;
       }
}while(next_permutation(a.begin(),a.end()));
}
return0;
}

其中的substr是取字符串某一部分的函数;

1 0