利用next_permutation解答全排列问题
枚举所有排列的另一个方法是从字典序最小排列开始,不停调用“求下一个排列”的过 程。
全排列的个数A(N,N)=(N)(N-1)…*2*1=N!
下一个排列:通常按照升序顺序(字典序)获得下一个排列
stl
next_permutation找下一个排列的算法
如果一个数组arr[]中存在重复元素,next_permutation是否工作正常呢?
STL使用“!(*i < *j)”进行判断大小,若相等则继续寻找,这样就会跳过重复的元素,进而跳过重复的全排列(如:1,2,2; 和1,2,2)。
返回值?
当返回为1时,表示找到了下一全排列;返回0时,表示无下一全排列。注意,如果从begin到end为降序,则表明全排列结束。
原理?
一个目的,不断地找最接近这个排列的下个排列,直到全部降序为止
template<calss BidrectionalIterator>
bool next_permutation(BidrectionalIterator first,BidrectionalIterator last)
{ if(first == lase) return false; /* 空区间 */ BidrectionalIterator i = first; ++i; if(i == last) return false; /* 只有一个元素 */ i = last; /* i指向尾端 */ --i; for(;;) { BidrectionalIterator ii = i; --i; /* 以上锁定一组(两个)相邻元素 */ if(*i < *ii) /* 如果前一个元素小于后一个元素 */ { BidrectionalIterator j = last; /* 令j指向尾端 */ while(!(*i < *--j)); /* 由尾端往前找,直到遇到比*i大的元素 */ iter_swap(i,j); /* 交换i,j */ reverse(ii,last); /* 将ii之后的元素全部逆序重排 */ return true; } if(i == first) /* 进行至最前面了 */ { reverse(first,last); /* 全部逆序重排 */ return false; } }
}
怎么用?
#include<cstdio>
#include<algorithm> //包含next_permutation
using namespace std;
int main( ) { int n, p[10]; scanf("%d", &n); for(int i = 0; i < n; i++) scanf("%d", &p[i]); sort(p, p+n); //排序,得到p的最小排列 do { for(int i = 0; i < n; i++){printf("%d ", p[i]); //输出排列p}printf("\n"); } while(next_permutation(p, p+n)); //求下一个排列 return 0;
}
do…while 循环是 while 循环的变体。在检查while()条件是否为真之前,该循环首先会执行一次do{}之内的语句,然后在while()内检查条件是否为真,如果条件为真的话,就会重复do…while这个循环,直至while()为假。
利用next_permutation解答全排列问题相关推荐
- python递归 数字全排列_利用递归实现全排列(python)
利用递归实现全排列(python) """ 利用递归实现全排列 第一个位置可能有n种可能,第二个位置可能 有n-1种可能...... 代码思路就是第一个位置可以和n个元素 ...
- python 利用递归实现全排列
使用递归实现全排列.123实现全排列! 法1: 上面定义了两个列表,一个列表存的是需要全排列的数据,另一个列表是当做栈来用的,可以把这个递归想成一棵树,在最顶端是包含所有值得列表,之后从这个列表中循环 ...
- 使用STL的next_permutation函数生成全排列(C++)
下午研究了一下全排列算法,然后发现C++的STL有一个函数可以方便地生成全排列,这就是next_permutation 在C++ Reference中查看了一下next_permutation的函数声 ...
- 算法竞赛入门经典 第七章 总结
目录: 7.1 简单枚举 7.2 枚举排列 7.3 子集生成 7.1 简单枚举 例题7-1 除法(Division, UVa 725) 输入正整数n,按从小到大的顺序输出所有形如abcde/fghij ...
- (全排列)Smallest Difference (poj2718)
题目: Description - 题目描述 给定若干位十进制数,你可以通过选择一个非空子集并以某种顺序构建一个数.剩余元素可以用相同规则构建第二个数.除非构造的数恰好为0,否则不能以0打头. 举例来 ...
- 【转】全排列算法非递归实现和递归实现
来源:http://blog.csdn.net/e3399/article/details/7543861 (一)递归的全排列算法 (A.B.C.D)的全排列为 1.A后面跟(B.C.D)的全排列 2 ...
- 全排列---STL方法与递归方法
1.STL-<algorithm>中的两个函数next_permutation和prev_permutation next_permutation:对于当前的排列,如果在字典序中还存在下一 ...
- poj 1256 Anagram—next_permutation的神奇应用
题意:给你一条字符串,让你输出字符串中字符的全排列,输出的顺序要按它给的奇葩的字典序. 题解:要输出全排列,暴力dfs可以过,但要注意题目的字典序以及相同字符的情况.如果用next_permutati ...
- 蓝桥杯书号验证——python解答
题目如下 2004年起,国际ISBN中心出版了<13位国际标准书号指南>. 原有10位书号前加978作为商品分类标识:校验规则也改变. 校验位的加权算法与10位ISBN的算法不同,具体算法 ...
最新文章
- 《Adobe Acrobat XI经典教程》—第6课转换PPT演示文稿
- SQL 2005 中的数据约束
- [三个版本]自定义int()函数(Python实现)
- 杂谈--从基数评估来看问题1
- Paper之CV:《One Millisecond Face Alignment with an Ensemble of Regression Trees》的翻译与解读
- 序列标注问题中将分类标签引入RNN网络结构的尝试
- html5储存类型,html5本地存储-留言板
- Android应用开发—FragmentManager如何管理fragments
- webstorm目录定位(自动定位)当前编辑的文件 - 设置篇
- netty ssl 服务器
- 导出FLASH用反射的时候要注意的问题
- SeetaFace6人脸识别源码编译和示例运行
- 计算机应用基础免费文档课件,计算机应用基础的课件.doc
- Wifi热点工具-青青草原WiFi
- java求100以内的素数
- matlab的基本函数,matlab基本函数
- MatConvNet的excise 3改为网络配置文件形式
- Html div 打印自动分页,网页打印自动分页
- JAVA-超大文件上传-如何上传文件-大文件上传
- simon手册翻译_part2
热门文章
- php 获取 table,php – 获取表对象(App_Model_TableName)作为获取结果(Zend Framework)
- html打开自动点击,如何把一段JS点击触发改为页面打开后就自动触发?
- hasset java_java HashSet的使用
- mysql 分页 order_Mysql查询使用limit分页,同时使用order by可能产生的问题
- java基础 最重要的部分_Java基础(1)最基础的部分
- 移除apt源_apt提示处理归档 (--unpack)时出错的解决办法
- 操作多台_一支热电偶能否连接多台显示仪表
- 2345王牌浏览器网页加载慢怎么办 网页加载慢解决
- IE浏览器怎么在桌面隐藏图标
- Android平台实现Unity3D下RTMP推送