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

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

题目描述

 一天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()));
}
return 0;
}

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

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值