竞赛中关于排列问题可能会使用到next_permutation函数的一个全排列,但是仍然需要掌握基本的排列的递归写法,下面简单介绍一下用法。(直到如何使用即可)

next_permutation函数将按字母表顺序生成给定序列的下一个较大的排列,直到整个序列为降序为止。
prev_permutation函数与之相反,是生成给定序列的上一个较小的排列。二者原理相同,仅遍例顺序相反

1.STL中的next_permutation 用法
2.全排列的递归写法

1.使用STL里面的函数进行全排列:(全排列前要需要排序才行)

数字排序:

#include<stdio.h>
#include<algorithm>
using namespace std;
int main(){char a[] = {1,2,3};sort(a,a+3);do{for(int i = 0;i < 3;i++) printf("%d ",a[]);printf("\n");}while(next_permutation(a,a+3));return 0;
}

输出结果:

123
132
213
231
321
312

字符串全排列:

#include<stdio.h>
#include<algorithm>
using namespace std;
//int cmp(const void *a,const void *b){//  return *(char *)a-*(char *)b;
//}
int main(){char a[] = "132";sort(a,a+3);//C++
//  qsort(a,3,sizeof(a[0]),cmp);//C do{printf("%s\n",a);}while(next_permutation(a,a+3));return 0;
}

输出结果:

123
132
213
231
321
312

结构体的全排序
解释一下,结构体也可以通过写 cmp 函数实现全排列,

next_permutation(node,node+n,cmp)

也可以借助下标进行全排列

#include<stdio.h>
#include<algorithm>
using namespace std;
const int Maxn = 3;
struct Node{int x;
}a[100];
int q[100];
int main(){for(int i = 1;i <= Maxn;i++){a[i].x = q[i] = i; //让结构体元素按照正常顺全排列
//      a[Maxn-i+1] = q[i] = i;  //顺序将会相反 }do{for(int i = 1;i <= Maxn;i++) printf("%d ",a[q[i]].x);printf("\n");}while(next_permutation(q+1,q+Maxn+1));return 0;
}

这个是STL中的源码可以参考一下,它的是非递归写法,下面会说到递归写法。参考链接

2.全排列的递归写法

#include <iostream>
using namespace std;
void get_permutation(char *a, int idx, int length)  //左下标和长度值,从头循环到尾
{if (idx == length-1){for (int i=0; i<length; ++i)printf("%s ",a);printf("\n");}else {for (int i=idx; i<length; ++i){swap(a[i],a[idx]);get_permutation(a,idx+1,length);swap(a[i],a[idx]);}}
}
int main()
{char array[] = "123";get_permutation(array,0,3);return 0;
}

输出结果:

123
132
213
231
321
312

最后:
next_permutation(num,num+n)函数是对数组num中的前n个元素进行全排列,同时并改变num数组的值。

另外,需要强调的是,next_permutation()在使用前需要对欲排列数组按升序排序,否则只能找出该序列之后的全排列数。

简单用法就是上面局的例子,时间复杂度是在 O(n!) ~ O(n∗n!) 之间,还是比较花时间的,所以慎用(蓝桥杯中用法会比较多)
参考链接

组合数学-next_permutation全排列相关推荐

  1. STL/next_permutation()和prev_permutation()函数

    next_permutation()和prev_permutation()函数的使用: next_permutation()和prev_permutation()函数的头文件添加为:#include  ...

  2. 1455E Four Points(思维+全排列)

    1455E Four Points(思维+全排列) Educational Codeforces Round 99 (Rated for Div. 2) E. Four Points 题面:Four ...

  3. HUST 1586 数字排列

    1586 - 数字排列 时间限制:1秒 内存限制:128兆 91 次提交 36 次通过 题目描述 现有n个k位的数字,你的任务是重新安排数字每一位的位置,使得重新安排后这n个数字中最大的数字和最小的数 ...

  4. 蓝桥杯C++ AB组辅导课

    整理的算法模板合集: ACM模板 今天在AcWing闲逛白嫖到了yxc老师的蓝桥杯C++ AB组辅导课的题单,正好快要蓝桥杯了,我准备每天花半个小时刷5道这个题单里的水题,练一练,不然到时候我各种花里 ...

  5. 【2019暑假刷题笔记-STL绪论(二)】总结自《算法笔记》

    目录 五.queue的常见用法 六.priority_queue的常见用法 七.stack的常见用法 八.algorithm头文件下的常用函数 五.queue的常见用法 queue也就是队列,是STL ...

  6. ACM/OI中C++常用优化(实用/调试/技巧)代码(语法)

    一.C++万能编译头文件 #include<bits/stdc++.h> 从 #include <iostream> #include <cstdio> #incl ...

  7. 【简便代码+解析】1056 组合数的和 (15分)_14行代码AC

    立志用更少的代码做更高效的表达 Pat乙级最优化代码+题解+分析汇总-->传送门 给定 N 个非 0 的个位数字,用其中任意 2 个数字都可以组合成 1 个 2 位的数字.要求所有可能组合出来的 ...

  8. 第十七届“科大讯飞杯”高校网络友谊赛——F-排列计算

    F-排列计算 题目描述 天才程序员菜哭武和石头组队参加一个叫做ICPC的比赛,这个比赛的规则是这样的: 一个选手给出一个长度为 n 的排列,另一个选手给出 m 个询问,每次询问是一个形如 (l, r) ...

  9. 十大算法基础——上(共有25道例题,大多数为简单题)

    一.枚举(Enumerate)算法 定义:就是一个个举例出来,然后看看符不符合条件. 举例:一个数组中的数互不相同,求其中和为0的数对的个数. for (int i = 0; i < n; ++ ...

最新文章

  1. python dataframe去掉索引_关于python:删除具有重复索引的行(Pandas DataFrame和TimeSeries)...
  2. 是否可能通过无限增加卷积核的办法使网络性能无限提升?
  3. ThinkingRock:最好的GTD软件
  4. windows netstat 查看端口、进程
  5. Markdown 编辑器才是yyds|CSDN编辑器测评
  6. 鼠标指针放置上面,显示内容_使鼠标指针远离您键入的内容
  7. (转)Spring Boot 2(一):【重磅】Spring Boot 2.0权威发布
  8. 2021杨铭杰高考成绩查询,谁知道汕头一中2007年高考成绩的概况
  9. 48页小米用户画像实战PPT
  10. SoundPool控件
  11. 详细解读 SQL 窗口函数
  12. ASIC 芯片 PVT
  13. 街头篮球服务器未响应,我的生涯我做主《街头篮球》生涯联赛FAQ
  14. 【怎么用u盘装系统】
  15. ctfshow 网络迷踪-给你拷上
  16. 基于python的opencv相机标定(采用黑白棋盘格标定板)
  17. 云服务器配置java环境
  18. Paper reading
  19. 深圳房价实现大逆袭,超越北京重回全国第一,杭州从第七降至第八。
  20. Net framework3.5装不上的解决办法

热门文章

  1. if-else-if语句和多个并列的if语句的区别
  2. 【OpenAirInterface】分立部署核心网与容器化ueransim仿真基站
  3. 微信计算机拆卸顺序记录表,清理微信PC电脑版指定修改日期的文件
  4. bzoj 4461: [Jsoi2013]美丽家园
  5. 服务器系统兼容性问题,服务器系统兼容性测试
  6. Android实现类似微信联系人中的分组列表
  7. 你真的了解PMP证书吗?现在PMP证书值得去考吗?
  8. CMake | 使用宏重用代码
  9. more command
  10. 第二章-空间众包(spatial crowdsourcing)概述