字符串的应用(续一)

                               擅长排列的小明

时间限制: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


#include<iostream>
#include<string>
#include<algorithm>                
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m,i,k=0;
cin>>n>>m;
string s1,s2;
for(i=1;i<=n;i++)
{
s1+=i+'0';
}
s2=s1.substr(0,m);                 
cout<<s2<<endl;
while(next_permutation(s1.begin(),s1.end()))            //next_permutation(),所以必须用到#include<algorithm>头文件
{
//cout<<"这是第"<<++k<<"次"<<endl;
//cout<<"字符串s1 "<<s1<<endl;
//cout<<"s2未处理 "<<s1.substr(0,m)<<endl;
if(s2!=s1.substr(0,m))
{
s2=s1.substr(0,m);
cout<<s2<<endl;
}
}
}
return 0;
}

归纳知识点:

(1) substr(start,length)  返回一个从指定位置开始,并具有指定长度的子字符串。

参数:
start
必选。所需的子字符串的起始位置。字符串中第一个字符的索引为 0。
length
可选项。返回的子字符串中包含的字符数。
备注
如果 length 为 0 或负数,将返回一个空字符串。如果没有指定该参数,则子字符串将延续到字符串的结尾。

(2)  next_permutation   这是一个求一个排序的下一个排列的函数,可以遍历全排列,要包含头文件<algorithm>,与之相反的是prev_permutation

int型的next_permutation ------- next_permutation(a,a+m)  备注:int a[3];  m必须小于等于3

char型的next_permutation-------next_permutation(first,last) 备注:char ch[200];  char*first=ch; char* last=ch+strlen(ch);

string 型的next_permutation------next_permutation(s.begin(),s.end()) 备注:string s;

原文地址:https://www.cnblogs.com/zdblog/p/3632691.html