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

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

题目描述

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

输入

 第一行输入一个数N(0

输出

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

样例输入

2
2
3

样例输出

12
21
123
132
213
231
312
321

代码如下

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

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


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

输入

 第一行输入整数N(1
每组测试数据第一行两个整数 n m (1

输出

在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
#include
#include
#include
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
     a+=i+ '1' ;
  s1=a.substr(0,m);
     cout<
next_permutation(a.begin(),a.end());//先给s2一个初值
do
{
     s2=a.substr(0,m);
     if (s1!=s2)
        {
            cout<
            s1=s2;
        }
} while (next_permutation(a.begin(),a.end()));
}
return 0;
}

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

你可能感兴趣的:(ACM)