特殊状态的枚举

  • 不调用next_permutation()
     1 bool used[MAX_N];
     2 int perm[MAX_N];
     3 
     4 // 生成{0, 1, 2, 3, ..., n-1}的n!种排列
     5 
     6 void permutation(int pos, int n) {
     7     if (pos == n) {
     8         // 这里写需要对perm进行的操作
     9         retrun ;
    10     }
    11 
    12     // 针对perm的第pos个位置,究竟使用0~n-1的哪一个进行循环
    13     for (int i = 0; i < n; i++) {
    14         if (!used[i]) {
    15             perm[pos] = i;
    16             // i已经被使用了,所以把标志设置为true
    17             used[i] = true;
    18             permutation(pos + 1, n);
    19             // 返回之后把标志复位
    20             used[i] = false;
    21         }
    22     }
    23     return ;

     

  • 调用next_permutation()
     1 #include <algorithm>
     2 
     3 // 即使有重复的元素也会生成所有的排列
     4 // next_permutation是按照字典序来生成下一个排列的
     5 int perm[MAX_N];
     6 
     7 void permutation(int n) {
     8     for (int i = 0; i < n; i++)
     9         perm[i] = i;
    10     do {
    11         // 这里写需要对perm进行的操作
    12     } while (next_permutation(perm, perm + n));
    13     // 所有的排列都生成后,next_permutation会返回false
    14     return ;
    15 }

     

上一篇:Janus流媒体服务器框架分析


下一篇:linux安全配置