对于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
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
---
填充m个数
如果当前填到第u个数,此时还差m-u个数才能填满,因为要按字典序排列
就需要第u个数的数值start 到数值n的个数大于等于 还要填值的个数
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[11];
void dfs(int u,int start){
if(n-start<m-u)return ; \\剪枝
if(u==m+1){
for(int i=1;i<=m;i++){
printf("%d ",a[i]);
}
printf("\n");
return ;
}
for(int i=start;i<=n;i++){
a[u]=i;
dfs(u+1,i+1);
a[u]=0; \\恢复现场
}
}
int main(){
scanf("%d %d",&n,&m);
dfs(1,1);
return 0;
}