题目描述
从 1∼n这 n个整数中随机选出 m个,输出所有可能的选择方案。
输入格式
两个整数 n,m,在同一行用空格隔开。
输出格式
按照从小到大的顺序输出所有方案,每行 1个。
首先,同一行内的数升序排列,相邻两个数用一个空格隔开。
其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如 1 3 5 7 排在 1 3 6 8 前面)。
数据范围
n>0 ,0≤m≤n,n+(n−m)≤25
样例
输入样例:
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
C++ 代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
int n,m;
const int N=26;
const int M=26;
int res[M];//用M来作为res的长度,因为最终要记录的是各个数位上的数是多少
int st[N];//用N作为st的长度,因为要探索数字1~n是否被标记过
void dfs(int u)//依旧是用u表示当前数位
{
if(u>=m+1)//注意这里用的是m
{
for(int i=1;i<=m;i++)
{
cout<<res[i]<<' ';
}
cout<<endl;
return;
}
for(int i=1;i<=n;i++)//用循环找出1~n中未被使用过的数字
{
if(st[i]!=1&&i>res[u-1])//注意!这里多了一个条件:必须要遵循从小到大的字典序,因此当前数位的数字(i)必须要大于前一个数位的数字(res[u-1])
{
res[u]=i;
st[u]=1;
dfs(u+1);
st[u]=0;
}
}
}
int main()
{
cin>>n>>m;
dfs(1);
}
Diary
感叹一下。。递归好像终于有点会了。。希望不是我的错觉。。。