题目
给定一个数T,表示接下来有T组数据。
每组数据给定两个正整数n和k,输出1~n中k个数的组合。
保证 k≤n≤10,输出的组合序列按照升序排列,每组数据中间有一行空行分隔。
样例输入
2
3 1
4 2
样例输出
1
2
3
1 2
1 3
1 4
2 3
2 4
3 4
解题
递归法
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
bool book[12];
int k,n; //n个数里找K个数
vector<int> ans;
//i为目前正在找第i个数,next为上一个合适的数的下一个
void f(int i,int next) {
//当位置找到k+1时,已找到k个数,输出ans
if (i == k + 1) {
for (int j = 0; j < (int)ans.size(); j++) {
cout << ans[j];
//格式要求
if (j <= (int)ans.size()-2)
cout << " ";
}
cout << endl;
ans.pop_back(); //把ans里的第i个位置的数清出ans,为返回后继续找可
//能的第i位置的数腾出位置
return;
}
while (next <= n) {
//next能用
if (book[next] == false) {
ans.push_back(next); //放入此次寻找答案的ans数组里
book[next] = true;
f(i+1, next); //找下一个位置
book[next] = false; //恢复
}
//当前位置下一个尝试的数
next++;
//当第个位置的next找完1~9这些数时,并且i-1个位置也有数时,把i-1这
//个数清出ans,找i-1位置的下一合适的数
if(next>n && !ans.empty())
ans.pop_back();
}
}
int main()
{
int T;
cin >> T;
while (T--) {
cin >> n >> k;
f(1, 1); //找第一个数,从1开始找
ans.clear(); //清空ans容器,以便在下一组使用空的ans容器
}
return 0;
}