枚举所有排列的另一个方法是从字典序最小排列开始,不停调用“求下一个排列”的过 程。
全排列的个数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解答全排列问题相关推荐

  1. python递归 数字全排列_利用递归实现全排列(python)

    利用递归实现全排列(python) """ 利用递归实现全排列 第一个位置可能有n种可能,第二个位置可能 有n-1种可能...... 代码思路就是第一个位置可以和n个元素 ...

  2. python 利用递归实现全排列

    使用递归实现全排列.123实现全排列! 法1: 上面定义了两个列表,一个列表存的是需要全排列的数据,另一个列表是当做栈来用的,可以把这个递归想成一棵树,在最顶端是包含所有值得列表,之后从这个列表中循环 ...

  3. 使用STL的next_permutation函数生成全排列(C++)

    下午研究了一下全排列算法,然后发现C++的STL有一个函数可以方便地生成全排列,这就是next_permutation 在C++ Reference中查看了一下next_permutation的函数声 ...

  4. 算法竞赛入门经典 第七章 总结

    目录: 7.1 简单枚举 7.2 枚举排列 7.3 子集生成 7.1 简单枚举 例题7-1 除法(Division, UVa 725) 输入正整数n,按从小到大的顺序输出所有形如abcde/fghij ...

  5. (全排列)Smallest Difference (poj2718)

    题目: Description - 题目描述 给定若干位十进制数,你可以通过选择一个非空子集并以某种顺序构建一个数.剩余元素可以用相同规则构建第二个数.除非构造的数恰好为0,否则不能以0打头. 举例来 ...

  6. 【转】全排列算法非递归实现和递归实现

    来源:http://blog.csdn.net/e3399/article/details/7543861 (一)递归的全排列算法 (A.B.C.D)的全排列为 1.A后面跟(B.C.D)的全排列 2 ...

  7. 全排列---STL方法与递归方法

    1.STL-<algorithm>中的两个函数next_permutation和prev_permutation next_permutation:对于当前的排列,如果在字典序中还存在下一 ...

  8. poj 1256 Anagram—next_permutation的神奇应用

    题意:给你一条字符串,让你输出字符串中字符的全排列,输出的顺序要按它给的奇葩的字典序. 题解:要输出全排列,暴力dfs可以过,但要注意题目的字典序以及相同字符的情况.如果用next_permutati ...

  9. 蓝桥杯书号验证——python解答

    题目如下 2004年起,国际ISBN中心出版了<13位国际标准书号指南>. 原有10位书号前加978作为商品分类标识:校验规则也改变. 校验位的加权算法与10位ISBN的算法不同,具体算法 ...

最新文章

  1. 《Adobe Acrobat XI经典教程》—第6课转换PPT演示文稿
  2. SQL 2005 中的数据约束
  3. [三个版本]自定义int()函数(Python实现)
  4. 杂谈--从基数评估来看问题1
  5. Paper之CV:《One Millisecond Face Alignment with an Ensemble of Regression Trees》的翻译与解读
  6. 序列标注问题中将分类标签引入RNN网络结构的尝试
  7. html5储存类型,html5本地存储-留言板
  8. Android应用开发—FragmentManager如何管理fragments
  9. webstorm目录定位(自动定位)当前编辑的文件 - 设置篇
  10. netty ssl 服务器
  11. 导出FLASH用反射的时候要注意的问题
  12. SeetaFace6人脸识别源码编译和示例运行
  13. 计算机应用基础免费文档课件,计算机应用基础的课件.doc
  14. Wifi热点工具-青青草原WiFi
  15. java求100以内的素数
  16. matlab的基本函数,matlab基本函数
  17. MatConvNet的excise 3改为网络配置文件形式
  18. Html div 打印自动分页,网页打印自动分页
  19. JAVA-超大文件上传-如何上传文件-大文件上传
  20. simon手册翻译_part2

热门文章

  1. php 获取 table,php – 获取表对象(App_Model_TableName)作为获取结果(Zend Framework)
  2. html打开自动点击,如何把一段JS点击触发改为页面打开后就自动触发?
  3. hasset java_java HashSet的使用
  4. mysql 分页 order_Mysql查询使用limit分页,同时使用order by可能产生的问题
  5. java基础 最重要的部分_Java基础(1)最基础的部分
  6. 移除apt源_apt提示处理归档 (--unpack)时出错的解决办法
  7. 操作多台_一支热电偶能否连接多台显示仪表
  8. 2345王牌浏览器网页加载慢怎么办 网页加载慢解决
  9. IE浏览器怎么在桌面隐藏图标
  10. Android平台实现Unity3D下RTMP推送