cpp#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;
// 递归函数生成组合
void generateCombinations(vector<int>& current, int n, int r, int index) {
// 如果已经选够了r个元素,输出当前组合
if (r == 0) {
for (int i = 0; i < current.size(); i++) {
cout << setw(3) << current[i]; // 输出占3个字符宽度的数字
}
cout << endl;
return;
}
// 如果遍历完了所有元素,结束递归
if (index > n) {
return;
}
// 选择当前元素
current.push_back(index);
generateCombinations(current, n, r - 1, index + 1);
// 不选择当前元素
current.pop_back();
generateCombinations(current, n, r, index + 1);
}
int main() {
int n, r;
cin >> n >> r;
vector<int> current; // 存放当前组合的容器
generateCombinations(current, n, r, 1); // 从第一个元素开始生成组合
return 0;
}
cpp#include <bits/stdc++.h>//万能头文件
using namespace std;
int total=0;
int a[50]; //a数组存每一次选的数
bool b[50];
int n,r;
void print(){ //打印函数
for(int i=1; i<=r; i++)
cout<<setw(3)<<a[i];//定义场宽为3,直接输出只能得10分
cout<<endl;
}
void search(int t)//搜索函数
{
int i;
if(t>r) { //如果搜完了就输出a数组
print();
return;
}
for(int i=1; i<=n; i++){ //枚举每一个数
if(!b[i]&&i>a[t-1]||t==1)//当i木有被使用过且i必须大于前个数但除1之外
{
a[t]=i; //将i存入a数组
b[i]=true;//标记i已被使用
search(t+1);//继续搜索
a[t]=0;//回溯一步
b[i]=false;
}
}
}
int main(){
cin>>n>>r;//输入
search(1);
return 0;
}
cpp#include<iostream>
#include<iomanip>
using namespace std;
int a[1005],n,m,arr = 1;
int main()
{
cin >> n >> m;
while(arr){
if(arr >= m + 1){ //达到边界时打印解
for(int i = 1;i <= m;i++)
cout << setw(3) << a[i]; //注意场宽设置
cout << endl;
arr--; //回溯到前一位
continue;
}
if(!a[arr]){ //若该位置为空
a[arr] = a[arr - 1] + 1; //在其前一位基础上加一
arr ++;
continue;
}
if(a[arr] + m - arr < n){ //**关键** 判定在当前位为a[arr]的情况下向后推(m - arr)位是否超出题目的最大数字限制
a[arr++] ++; //当前位自加后挪至后一位
continue;
}
a[arr--] = 0; //将当前位归零,回溯至前一位
}
return 0;
}
本文作者:yowayimono
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!