当前位置: 首页 > news >正文

用递归实现各种排列

为了满足字典序的输出,我采用了逐位递归的方法(每一位的所能取到的最小值都大于前一位)

1,指数型排列

#include<bits/stdc++.h>
using ll = long long int;
using namespace std;
int a[10];void printp(int m) {for (int h = 0; h <= m; h++) {if (h) cout << " ";cout << a[h];}cout << endl;return;
}void go(int i, int min, int n) {if (min > n) return;for (int k = min; k <= n; k++) {a[i] = k;printp(i);go(i + 1, k + 1, n);}return;
}int main() {int n;cin >> n;go(0, 1, n);return 0;
}

2,组合型枚举

#include<bits/stdc++.h>
using ll=long long int;
using namespace std;
int a[10];void printp(int m){for(int i=0;i<m;i++){if(i) cout<<" ";cout<<a[i];}cout<<endl;return;
}void go(int i,int min,int n,int m){if(i==m) printp(m);for(int k=min;k<=n;k++){//&&n-k>=m-1-ia[i]=k;go(i+1,k+1,n,m);}return;
}int main(){int n,m;cin>>n>>m;go(0,1,n,m);return 0;
}

 注释的部分是递归的剪枝操作,避免过早取到太大的值导致后面的值无法取,加上剪枝还是能省不少时间的

3,排列型枚举

#include<bits/stdc++.h>
using ll=long long int;
using namespace std;
int a[10],vis[10]={0};void printp(int n){for(int i=0;i<n;i++){if(i) cout<<" ";cout<<a[i];}cout<<endl;
}void go(int i,int n){if(i==n) printp(n);for(int k=1;k<=n;k++){if(vis[k]) continue;a[i]=k;vis[k]=1;go(i+1,n);vis[k]=0;}
}int main(){int n;cin>>n;go(0,n);return 0;
}

这个枚举与前两个不同,因为是排列的枚举,所以不要求字典序输出,因此问题转换成了如何避免重复,所以我专门开了一个状态数组来记录这个数位上要取的值是否已经被取过了

相关文章:

  • Java 显式锁与 Condition 的使用详解
  • MySQL 数据库
  • VBA -- 学习Day2
  • STM32系统定时器以及微秒延时函数分析
  • 在openEuler系统下编译安装Redis数据库指南
  • JavaSE核心知识点02面向对象编程02-02(封装、继承、多态)
  • 基于Partial Cross Entropy的弱监督语义分割实战指南
  • Python开发之os.path的常用操作
  • 2025年3月青少年机器人技术等级考试(二级)理论综合真题试卷
  • 【使用switch结构输出季节】2021-11-23
  • Wubuntu安装时创建分区失败解决方案
  • 贝叶斯定理
  • [python] 函数1-函数基础
  • uniapp index.html怎么改都不生效
  • Java 异常
  • 【PhysUnits】2 SI 量纲 实现解析(prefix.rs)
  • el-table合并单元
  • 数据结构(三)——栈和队列
  • uniapp-文件查找失败:‘@dcloudio/uni-ui/lib/uni-icons/uni-icons.vue‘
  • 记录一次华为魔改 fusionlnsight和ai问答的狗血故事
  • 上海消防全面推行“检查码”,会同相关部门推行“综合查一次”
  • 治沙“异瞳”男生疑似摆拍,团队称合作12天多期视频为策划拍摄
  • 澎湃研究所“营商环境研究伙伴计划”启动
  • 华为招聘:未与任何第三方开展过任何形式的实习合作
  • 昆廷·斯金纳:作为“独立自主”的自由
  • 王耀庆化身“罗朱”说书人,一人挑战15个角色