对于1~n这n个不同的数,按照一定的顺序把其中m个数排列起来(每个数最多出现一次,m<n<=10),将所有的这种部分排列按字典序列出,每一个排列的数按从小到大,称为有序部分排列。
输入格式:
一个数n和m。
输出格式:
输出按字典序的有序部分排列,每行的数间用一个空格隔开,最后一个数后有空格。最后多出一行空格
输入样例:
5 3
输出样例:
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5
这道题怎么说呢就是递归,没啥说的,直接上代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[100];
void perm(int k){
if(k==m+1){
for(int i=1;i<=m;i++){
cout<<a[i]<<" ";
}
cout<<endl;
return ;
}
for(int i=1;i<=n;i++){
if(a[k-1]<i){//每一次都用数组的值与i来进行比较,从而实现从小到大排列
a[k]=i;
perm(k+1);
}
}
}
int main()
{
cin>>n>>m;
perm(1);//从1开始是因为题目要求每一个排列的数按从小到大排列
return 0;
}