您的位置:首页 > 其它

STL——全排列问题

2016-11-17 13:56 211 查看
查看原文:http://www.wyblog.cn/2016/11/17/stl-%e5%85%a8%e6%8e%92%e5%88%97%e9%97%ae%e9%a2%98/

擅长排列的小明
时间限制:1000 ms | 内存限制:65535 KB
难度:4
描述
小明十分聪明,而且十分擅长排列计算。比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想为难他,在这5个数字中选出几个数字让他继续全排列,那么你就错了,他同样的很擅长。现在需要你写一个程序来验证擅长排列的小明到底对不对。
输入
第一行输入整数N(1<N<10)表示多少组测试数据,
每组测试数据第一行两个整数 n m (1<n<9,0<m<=n)
输出
在1-n中选取m个字符进行全排列,按字典序全部输出,每种排列占一行,每组数据间不需分界。如样例
样例输入
2
3 1
4 2
样例输出
1
2
3
12
13
14
21
23
24
31
32
34
41
42
43
来源
[hzyqazasdf]原创
上传者
hzyqazasdf

这里主要是一个全排列问题,然后从所有全排列里筛选出符合题目要求的排列进行截断处理。
全排列函数可以使用next_permutation()。在此也简单叙述一下原理:

在STL中,除了next_permutation外,还有一个函数prev_permutation,两者都是用来计算排列组合的函数。前者是求出下一个排列组合,而后者是求出上一个排列组合。所谓“下一个”和“上一个”,书中举了一个简单的例子:对序列 {a, b, c},每一个元素都比后面的小,按照字典序列,固定a之后,a比bc都小,c比b大,它的下一个序列即为{a, c, b},而{a, c, b}的上一个序列即为{a, b, c},同理可以推出所有的六个序列为:{a, b, c}、{a, c, b}、{b, a, c}、{b, c, a}、{c, a, b}、{c, b, a},其中{a, b, c}没有上一个元素,{c, b, a}没有下一个元素。

解题代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

int main(void)
{
int t,n,m;
char a[10]={'1','2','3','4','5','6','7','8','9'};
char b[10],c[10];
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
strcpy(b,a);
b[m]='\0';
printf("%s\n",b);
while(next_permutation(a,a+n))
{
strcpy(c,a);
c[m]='\0';
if(strcmp(b,c))
{
strcpy(b,c);
b[m]='\0';
printf("%s\n",b);
}
}
}
return 0;
}
查看原文:http://www.wyblog.cn/2016/11/17/stl-%e5%85%a8%e6%8e%92%e5%88%97%e9%97%ae%e9%a2%98/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: