• 递归实现排列型枚举


     

     方法一:c++自带的next_permutation函数

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int a[15];
     4 int main() {
     5     int n;
     6     cin >> n;
     7     for (int i = 0; i < n; i++) {
     8         a[i] = i + 1;
     9     }
    10     sort(a, a + n);
    11     do {
    12         for (int i = 0; i < n; i++) {
    13             cout << a[i] << " ";
    14         }
    15         cout << endl;
    16     } while(next_permutation(a, a + n));
    17     return 0;
    18 }

    方法二:dfs。搜索顺序:从前往后遍历每个位置,判断这个位置放哪个数

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int N = 15;
     4 int way[N]; //存储每种方案
     5 bool used[N]; //判断每个数有没有被用过,true表示用过,false没用过
     6 int n;
     7 void dfs(int u) {
     8     if (u == n + 1) {
     9         for (int i = 1; i <= n; i++) { //打印方案
    10             cout << way[i] << " ";
    11         }
    12         cout << endl;
    13         return;
    14     }
    15     //依次枚举每个分支,即当前位置可以放哪些数
    16      for (int i = 1; i <= n; i++) { //从小到大
    17          if (!used[i]) { //找一个没用过的数
    18             way[u] = i; //放在u这个位置
    19             used[i] = true; //i这个数用过了
    20             dfs(u + 1); //搜索下一层
    21             way[u] = 0; //回溯回复现场
    22             used[i] = false;
    23          }
    24      }
    25 }
    26 int main() {
    27     cin >> n;
    28     dfs(1); //从第一位开始
    29     return 0;
    30 }
  • 相关阅读:
    JavaScript语言基础
    IP地址分类及CIDR划分方法
    Python静态方法实现单实例模式
    【转载】http和socket之长连接和短连接
    DDoS攻击
    Vue自定义过滤器
    解决跨域问题
    微信菜单创建
    canvas标签(1)--线条、矩形、圆形、文本、阴影、抛小球
    Bootstrap CSS概览代码文字标注篇
  • 原文地址:https://www.cnblogs.com/fx1998/p/13901431.html
Copyright © 2020-2023  润新知