编辑
2023-10-22
数据结构与算法
00
请注意,本文编写于 566 天前,最后修改于 566 天前,其中某些信息可能已经过时。
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 许可协议。转载请注明出处!