擅长排列的小明
时间限制:
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
样例输出
-
2 3 12 13 14 21 23 24 31 32 34 41 42 43
来源
C++STL的next_permutation
这是一个求一个排序的下一个排列的函数,可以遍历全排列,要包含头文件<algorithm>
与之完全相反的函数还有prev_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}没有下一个元素。-------转载
string s("12345asdf");
string a=s.substr(0,5); --获得字符串s中 从第0位开始的长度为的字符串//默认时的长度为从开始位置到尾
#include <iostream> #include <string.h> #include <algorithm> using namespace std; int main() { int N; cin>>N; while (N--) { int n,m; int i,j; cin>>n>>m; string a,b; for (i=1;i<=n;i++) a += i+'0'; b = a.substr(0,m); cout<<b<<endl; while (next_permutation(a.begin(),a.end())) { if (b!=a.substr(0,m)) { b = a.substr(0,m); cout<<b<<endl; } } } return 0; }
-
第一行输入整数N(1<N<10)表示多少组测试数据,