组合数学-next_permutation全排列
竞赛中关于排列问题可能会使用到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全排列相关推荐
- STL/next_permutation()和prev_permutation()函数
next_permutation()和prev_permutation()函数的使用: next_permutation()和prev_permutation()函数的头文件添加为:#include ...
- 1455E Four Points(思维+全排列)
1455E Four Points(思维+全排列) Educational Codeforces Round 99 (Rated for Div. 2) E. Four Points 题面:Four ...
- HUST 1586 数字排列
1586 - 数字排列 时间限制:1秒 内存限制:128兆 91 次提交 36 次通过 题目描述 现有n个k位的数字,你的任务是重新安排数字每一位的位置,使得重新安排后这n个数字中最大的数字和最小的数 ...
- 蓝桥杯C++ AB组辅导课
整理的算法模板合集: ACM模板 今天在AcWing闲逛白嫖到了yxc老师的蓝桥杯C++ AB组辅导课的题单,正好快要蓝桥杯了,我准备每天花半个小时刷5道这个题单里的水题,练一练,不然到时候我各种花里 ...
- 【2019暑假刷题笔记-STL绪论(二)】总结自《算法笔记》
目录 五.queue的常见用法 六.priority_queue的常见用法 七.stack的常见用法 八.algorithm头文件下的常用函数 五.queue的常见用法 queue也就是队列,是STL ...
- ACM/OI中C++常用优化(实用/调试/技巧)代码(语法)
一.C++万能编译头文件 #include<bits/stdc++.h> 从 #include <iostream> #include <cstdio> #incl ...
- 【简便代码+解析】1056 组合数的和 (15分)_14行代码AC
立志用更少的代码做更高效的表达 Pat乙级最优化代码+题解+分析汇总-->传送门 给定 N 个非 0 的个位数字,用其中任意 2 个数字都可以组合成 1 个 2 位的数字.要求所有可能组合出来的 ...
- 第十七届“科大讯飞杯”高校网络友谊赛——F-排列计算
F-排列计算 题目描述 天才程序员菜哭武和石头组队参加一个叫做ICPC的比赛,这个比赛的规则是这样的: 一个选手给出一个长度为 n 的排列,另一个选手给出 m 个询问,每次询问是一个形如 (l, r) ...
- 十大算法基础——上(共有25道例题,大多数为简单题)
一.枚举(Enumerate)算法 定义:就是一个个举例出来,然后看看符不符合条件. 举例:一个数组中的数互不相同,求其中和为0的数对的个数. for (int i = 0; i < n; ++ ...
最新文章
- vue2.0小示例一个~~新鲜出炉哦。欢迎大家留言
- 大学医用计算机答案,医学文献检索试题(含答案)
- C语言 文件操作5--文件的常用函数
- 如何优雅地进行错误处理(clean code阅读笔记之六)
- kubernetes-[1]-简单介绍
- python运维脚本面试_参加Linux运维面试时经常会被问到的shell脚本问题有哪些?
- jsp注册里密码强弱怎么弄_JavaScript注册时密码强度校验代码
- opencv图像灰化_Opencv——彩色图像灰度化的三种算法
- idea项目中使用URule 规则引擎的简单例子
- scratch的官方版本和其他的改编版本/小喵科技Kittenblock/snap!/TurboWarp
- python3 输出不换行
- css -moz_moz-border-radius(CSS属性)
- [电影]推荐《启示》--完美的玛雅文化背景
- 基于Python的个人足迹地图绘制设计
- 网易滑块识别-通用滑块识别
- 缓解环境噪声对音频质量干扰
- 他是学计算机的这个句子中宾语是动词性的,语法一实词(教师)2017级
- 一文详解:java开发安卓应用
- 区块链技术 英文(BlockChain Terminal)简称BCT ——区块链终端
- 怎么调用android 自带的图片浏览器